我在数据库中建了以下:
CREATE OR REPLACE PACKAGE queryData as
  type myrctype is ref cursor;
                  
end queryData;create or replace procedure getSH_EMS_INData(conditionStr in varchar2,myrc out querydata.myrctype) is
begin
dbms_output.put_line(conditionStr);
  open myrc for 'select product_id from sh_ems_in :1' using ' where 1=1';
  --open myrc for select product_id from sh_ems_in;
end getSH_EMS_INData;
在SQLPLUS中执行:
set serveroutput on
declare
myrc queryData.myrctype;
str  varchar2(20);
begin
getSH_EMS_INData(' where 1 = 1',myrc);
loop
fetch myrc into str;
dbms_output.put_line(str);
exit when myrc%notfound;
end loop;
end;
/出现错误ORA-00933: SQL 命令未正确结束
ORA-06512: 在"TINGER.GETSH_EMS_INDATA", line 4
ORA-06512: 在line 5
能帮我看一下,错在那吗?

解决方案 »

  1.   

    CREATE OR REPLACE PACKAGE queryData as
      type myrctype is ref cursor;
                      
    end queryData;create or replace procedure getSH_EMS_INData(conditionStr in varchar2,myrc out querydata.myrctype) is
    vs_sql varchar2(100);
    begin
    vs_sql:='select product_id from sh_ems_in :1' using ' where 1=1';
    dbms_output.put_line(conditionStr);
      open myrc for vs_sql;
      --open myrc for select product_id from sh_ems_in;
    end getSH_EMS_INData;
    试验试验!应该可以了
      

  2.   

    oracle 的动态游标参数是有限制的,它传递的是参数值列表,而不是简单的字符串
    可以是open cursorname for 'select cols from tablename where col_name = :1 ' using '条件值' 的格式
    但不能是open cursorname for 'select cols from tablename :1' using '1=1'的格式;
    如果要实现这样的目的,只能这样做:
    CREATE OR REPLACE PACKAGE queryData as
      type myrctype is ref cursor;
                      
    end queryData;create or replace procedure getSH_EMS_INData(conditionStr in varchar2,myrc out querydata.myrctype) is
    begin
    var_sql varchar2(8000);
    dbms_output.put_line(conditionStr);
      var_sql := 'select product_id from sh_ems_in ' ;
      var_sql := var_sql || conditionStr;  --假设你想代入的字符串应该就是条件列表
      open myrc for var_sql;
      --open myrc for select product_id from sh_ems_in;
    end getSH_EMS_INData;
    这样就不会有任何错误的。
      

  3.   

    楼上的是没有问题,但是问题时怎么不能用绑定变量呢?pl/sql不能在包里面有绑定变量吗?
      

  4.   

    queryData .getSH_EMS_INData(' where 1 = 1',myrc);
    package中的prc执行要带package名