ORA-00900:SQL语句无效错误?我的sql出了什么问题?

时间:2016-06-07 15:53:21

标签: sql oracle oracle11g db-solo

我尝试编写一个拆分字符串的函数,但它显示: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中运行脚本。 错误图片是: enter image description here

1 个答案:

答案 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创建了类型和功能之后。

或者,当然,使用不同的客户......