我尝试编写一个拆分字符串的函数,但它显示:ORA-00900: invalid SQL statement error
。出了什么问题?我认为v_str varchar2(500);
或v_strs_last varchar2(4000) := p_value;
可能是错误的。
CREATE OR REPLACE TYPE strsplit_type IS TABLE OF VARCHAR2 (4000);
create or replace function strsplit(p_value varchar2,
p_split varchar2 := ',')
return strsplit_type
pipelined is
v_idx integer;
v_str varchar2(500);
v_strs_last varchar2(4000) := p_value;
begin
loop
v_idx := instr(v_strs_last, p_split);
exit when v_idx = 0;
v_str := substr(v_strs_last, 1, v_idx - 1);
v_strs_last := substr(v_strs_last, v_idx + 1);
pipe row(v_str);
end loop;
pipe row(v_strs_last);
return;
end strsplit;
我的oracle版本是Oracle Database 11g企业版版本11.2.0.3.0 - 64位生产。我在DB SOLO 5中运行脚本。 错误图片是:
答案 0 :(得分:4)
您的DB Solo客户端似乎正在解释它看作语句结尾的第一个分号,这对于纯SQL(DML或DDL)是合理的,但对于PL / SQL则不合适。
您可以从发布的日志图片中看到;它将create function ... v_ids integer
部分视为一个语句,因为它以第一个分号结束 - 它编译但有错误。然后它将下一个分块作为单独的语句 - v_str varchar2(5000)
- 作为单独的语句 - create type
- 并且它获取ORA-00900,因为它不是有效的SQL。
According to the documentation:
语句必须用分号或“' GO”分隔。关键词。您可以将设置更改为仅使用分号或“' GO'作为语句分隔符而不是接受任何一个的默认设置。当您在查询编辑器中有多个语句时,DB Solo会一次将它们发送到您的服务器。
所以基于它似乎并不了解如何区别对待PL / SQL;但是您可以将设置更改为不将分号视为语句分隔符 - 全面,这意味着您需要在create function
和/
语句以及任何其他查询之后添加GO或打电话给你。这类似于在SQL * Plus或SQL Developer中使用test_int_array: $(OBJS)
$(CC) -o $@ $^ $(CFLAGS)
。
使用the procedure editor可能更容易。大概是在你从the object browser创建了类型和功能之后。
或者,当然,使用不同的客户......