在SYS_REFCURSOR中执行动态sql语句

use*_*643 11 sql oracle plsql

是否可以在plsql中执行动态的sql并将结果返回到sys_refcursor?我已经粘贴了我的尝试,但dosnt缝合工作,这是我的java应用程序的错误

ORA-01006:绑定变量不存在ORA-06512:在"LIVEFIS.ERC_REPORT_PK",第116行ORA-06512:在第1行

但这可能是由java误解的东西,一切接缝编译精细soo我不确定.

 procedure all_carers_param_dy (pPostcode in carer.postcode%type, pAge Number
                                ,pReport out SYS_REFCURSOR) is
  begin
    declare
      lsql  varchar2(500) :='SELECT c.id FROM carer c, cared_for cf,carer_cared_for ccf '
          ||' where c.id = ccf.carer_id (+)'
          ||' AND cf.id (+) = ccf.cared_for_id';

    begin

     if pPostcode is not null and pAge <= 0 then
        lsql := lsql||' AND c.postcode like ''%''|| upper(pPostcode)||''%''';
      elsif pPostcode is null and pAge > 0 then 
         lsql := lsql||' AND ROUND((MONTHS_BETWEEN(sysdate,c.date_of_birth)/12)) = pAge';
      elsif pPostcode is not null and pAge > 0 then
         lsql := lsql ||' AND ROUND((MONTHS_BETWEEN(sysdate,c.date_of_birth)/12)) = pAge'
                      ||' AND c.postcode like ''%''|| upper(pPostcode)||''%''';
      end if;


        execute immediate lsql
        into pReport;


    end;
  end;
Run Code Online (Sandbox Code Playgroud)

我是plsql的新手,甚至更新的动态sql soo任何帮助/建议都会大大贬值.

再次感谢

乔恩

Vin*_*rat 8

你必须绑定参数pAgepPostcode.在动态SQL中,您将使用冒号(:)作为前缀.如果您使用EXECUTE IMMEDIATEOPEN ... FOR,您将通过位置绑定您的参数,这就是我重命名它们的原因:P1和:示例中的P2:

DECLARE
   lsql VARCHAR2(500) := 'SELECT c.id 
                            FROM carer c, cared_for cf, carer_cared_for ccf 
                           WHERE c.id = ccf.carer_id (+)
                             AND cf.id (+) = ccf.cared_for_id';
BEGIN
   IF pPostcode IS NULL THEN
      lsql := lsql || ' AND :P1 IS NULL';
   ELSE
      lsql := lsql || ' AND c.postcode like ''%''|| upper(:P1)||''%''';
   IF pPostcode pAge > 0 THEN
      lsql := lsql || ' AND :P2 = ROUND((MONTHS_BETWEEN(sysdate,
                                                        c.date_of_birth)/12))';
   ELSE
      lsql := lsql || ' AND nvl(:P2, -1) <= 0';
   END IF;
   OPEN pReport FOR lsql USING pPostcode, pAge;
END;
Run Code Online (Sandbox Code Playgroud)

注意:绑定变量的数量和位置必须在编译时知道,这就是为什么我经常使用上面的构造(即使它没有被使用,也将参数添加到它的位置).在AND :P1 IS NULL查询中添加重言式(如),不会影响其解释计划.


RC.*_*RC. 5

您不能通过使用execute immediate来分配refcursor.

您必须将SQL构建为字符串然后使用open.

sql_str := 'SELECT * FROM...';
open pReport for sql_str;
Run Code Online (Sandbox Code Playgroud)