Хранимая процедура с использованием Execute Immediate с привязкой - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть работающая хранимая процедура, и я хотел бы ее улучшить / упростить.

 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 и не использовать конкатенацию.

Документ из Oracle дал мне несколько методов, но когда япопробовал их у них просто не получилось.

1 Ответ

0 голосов
/ 14 декабря 2018

Как насчет использования предложения 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

...