Oracle 动态选择执行缺少表达式错误
我使用的是Oracle12,我想创建一个动态过程,根据未知条件从特定表中选择行。该条件将被指定为输入参数 假设我有一个名为Oracle 动态选择执行缺少表达式错误,oracle,oracle12c,Oracle,Oracle12c,我使用的是Oracle12,我想创建一个动态过程,根据未知条件从特定表中选择行。该条件将被指定为输入参数 假设我有一个名为employee id的列,我想调用这个过程 有下列情况 execute s('employeeid = 2') 我的代码是 create or replace procedure s (condition varchar) as TYPE EmpCurTyp IS REF CURSOR; -- define weak REF CURSOR type emp_
employee id
的列,我想调用这个过程
有下列情况
execute s('employeeid = 2')
我的代码是
create or replace procedure s (condition varchar)
as
TYPE EmpCurTyp IS REF CURSOR; -- define weak REF CURSOR type
emp_cv EmpCurTyp; -- declare cursor variable
my_ename VARCHAR2(15);
my_sal NUMBER := 2;
mycondition varchar2(100):=condition;
BEGIN
OPEN emp_cv FOR -- open cursor variable
'SELECT employeeid, employeename FROM employees WHERE = :s' USING mycondition;
END;
但是我犯了个错误
缺失表达
我做错了什么,这个过程的结果会从employees表中选择满足应用条件的行吗?这还没有嵌入到一个过程中,但我测试了它,并且可以工作:
DECLARE
TYPE OUT_TYPE IS TABLE OF VARCHAR2 (20)
INDEX BY BINARY_INTEGER;
l_cursor INTEGER;
l_fetched_rows INTEGER;
l_sql_string VARCHAR2 (250);
l_where_clause VARCHAR2 (100);
l_employeeid VARCHAR2 (20);
l_employeename VARCHAR2 (20);
l_result INTEGER;
o_employeeid OUT_TYPE;
o_employeename OUT_TYPE;
BEGIN
l_cursor := DBMS_SQL.OPEN_CURSOR;
l_sql_string := 'SELECT employeeid, employeename FROM employees WHERE ';
l_where_clause := 'employeeid = 2';
l_sql_string := l_sql_string || l_where_clause;
DBMS_SQL.PARSE (l_cursor, l_sql_string, DBMS_SQL.V7);
DBMS_SQL.DEFINE_COLUMN (l_cursor,
1,
l_employeeid,
20);
DBMS_SQL.DEFINE_COLUMN (l_cursor,
2,
l_employeename,
20);
l_fetched_rows := 0;
l_result := DBMS_SQL.EXECUTE_AND_FETCH (l_cursor);
LOOP
EXIT WHEN l_result = 0;
DBMS_SQL.COLUMN_VALUE (l_cursor, 1, l_employeeid);
DBMS_SQL.COLUMN_VALUE (l_cursor, 2, l_employeename);
l_fetched_rows := l_fetched_rows + 1;
o_employeeid (l_fetched_rows) := l_employeeid;
o_employeename (l_fetched_rows) := l_employeename;
l_result := DBMS_SQL.FETCH_ROWS (l_cursor);
END LOOP;
DBMS_SQL.CLOSE_CURSOR (l_cursor);
DBMS_OUTPUT.PUT_LINE (o_employeeid (1));
DBMS_OUTPUT.PUT_LINE (o_employeename (1));
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.PUT_LINE ('GENERAL FAILURE: ' || SQLERRM);
END;
使用的
旨在处理值,而不是代码片段;如果需要根据输入参数编辑查询(我认为这是一种非常危险的编码方式),则应将条件视为字符串连接到查询
例如,假设您有以下表格:
create table someTable(column1 number)
此过程执行与您需要的类似的操作:
create or replace procedure testDyn( condition IN varchar2) is
cur sys_refcursor;
begin
open cur for 'select column1 from sometable where ' || condition;
/* your code */
end;
它的工作原理是:
SQL> exec testDyn('column1 is null');
PL/SQL procedure successfully completed.
SQL> exec testDyn('column99 is null');
BEGIN testDyn('column99 is null'); END;
*
ERROR at line 1:
ORA-00904: "COLUMN99": invalid identifier
ORA-06512: at "ALEK.TESTDYN", line 4
ORA-06512: at line 1
我发现我的错误是因为where关键字后面的=引起的,但是我得到了错误“无效的关系运算符”现在,我想知道我是否走上了正确的道路,是否能够以传递的条件作为参数实现动态执行。你是对的,非常感谢,但正如我提到的,我想验证我的整个过程机制的正确性。谢谢thomas Naessens,但代码中的闭合游标应该是emp_cv,而不是v_emp_游标,以便我当前工作测试另一种方法。假设我们在表中插入一条记录