Oracle 使用带绑定的executeimmediate的存储过程

Oracle 使用带绑定的executeimmediate的存储过程,oracle,execute-immediate,parameterbinding,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 = '''

我有一个正常工作的存储过程,希望对其进行改进/简化

 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;
/
理想情况下,我想让它更容易扩展。我想重写executeimmediate行,如下所示

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:无效的表名”

告诉我“ORA-01006:绑定变量不存在”

如果不进行表绑定,我并不介意,因为这样的绑定会更少,但我真的希望能够进行where绑定,而不使用连接


给了我几种方法,但当我尝试它们时,它们都不起作用。

在您的过程中使用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

演示:

我可以发誓我曾经尝试过这种方法,但可能是在我通过从内部移除into来立即执行之前。当我尝试这种方法时,它确实奏效了。非常感谢。
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