[英]Stored Procedure using Execute Immediate with binding
I have a working Stored Procedure and would like to improve/simplify it. 我有一个正在运行的存储过程,并且想要改进/简化它。
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;
/
I would ideally like to make it easier to expand. 理想情况下,我想使其更易于扩展。 I would like to rewrite the execute immediate line like
我想像这样重写立即执行行
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || IN_TABLE
|| ' WHERE TYPEVALUE = '':IN_TYPE'' '
into OUT_COUNT;
When I use this method, I get 0 as my return value. 使用此方法时,我的返回值为0。
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM :IN_TABLE WHERE TYPEVALUE = ''' || IN_TYPE
|| ''' ' into OUT_COUNT;
This one gives me "ORA-00903: invalid table name". 这给了我“ ORA-00903:无效的表名称”。
EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM ' || IN_TABLE
|| ' WHERE TYPEVALUE = '':1'' '
into OUT_COUNT using IN_TYPE;
Gives me "ORA-01006: bind variable does not exist". 给我“ ORA-01006:绑定变量不存在”。
I don't mind so much if the table binding doesn't happen because there will be fewer of those, but I really want to be able to do the where binding and not use the concatenation. 我不介意如果表绑定没有发生,因为它们会更少,但是我真的很希望能够进行where绑定而不使用串联。
The document from Oracle gave me several methods, but when I tried them they just did not work. Oracle的文档为我提供了几种方法,但是当我尝试使用它们时,它们只是无效。
What about using USING clause in your procedure: 如何在过程中使用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
Demo: https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=1fb7e29017e3c5f4309ed25bbeddf7f6 演示: https : //dbfiddle.uk/?rdbms = oracle_11.2&fiddle = 1fb7e29017e3c5f4309ed25bbeddf7f6
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.