使用具有绑定的立即执行的存储过程

时间:2018-12-13 20:23:37

标签: oracle execute-immediate parameterbinding

我有一个正在运行的存储过程,并且希望对其进行改进/简化。

 CREATE OR REPLACE PROCEDURE DOCSADM.DRILL_COUNTV5 ( IN_TABLE IN VARCHAR2, IN_TYPE IN VARCHAR2, OUT_COUNT OUT NUMBER) AS
BEGIN
      EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || IN_TABLE 
          || ' WHERE TYPEVALUE = ''' || IN_TYPE || ''' ' 
          into OUT_COUNT;
END DRILL_COUNTV5;
/

理想情况下,我想使其更易于扩展。我想像这样重写执行立即行

EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || IN_TABLE 
     || ' WHERE TYPEVALUE = '':IN_TYPE'' ' 
     into OUT_COUNT;

使用此方法时,返回值为0。

EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM :IN_TABLE WHERE TYPEVALUE = ''' || IN_TYPE 
     || ''' ' into OUT_COUNT;

这个给了我“ ORA-00903:无效的表名”。

EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || IN_TABLE 
  || ' WHERE TYPEVALUE = '':1'' ' 
  into OUT_COUNT using IN_TYPE;

给我“ ORA-01006:绑定变量不存在”。

如果表绑定不发生,我并不介意,因为这样的表绑定会更少。但是我真的希望能够进行where绑定而不使用串联。

document from Oracle给了我几种方法,但是当我尝试它们时,它们只是行不通。

1 个答案:

答案 0 :(得分:2)

在过程中使用USING子句怎么办?

CREATE TABLE ttt(
  typevalue varchar2(10)
);

INSERT INTO ttt VALUES('123');

DECLARE 
  IN_TABLE varchar2(10) := 'ttt';
  typval varchar2(10) := '123';
  OUT_COUNT number;
BEGIN
  EXECUTE IMMEDIATE 
        'SELECT COUNT(*) FROM ' || IN_TABLE || ' WHERE TYPEVALUE = :p ' 
         INTO  OUT_COUNT USING IN typval;
  DBMS_OUTPUT.PUT_LINE( OUT_COUNT );
END;
/

==============================
dbms_output:
1

演示:https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=1fb7e29017e3c5f4309ed25bbeddf7f6