Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 动态选择执行缺少表达式错误_Oracle_Oracle12c - Fatal编程技术网

Oracle 动态选择执行缺少表达式错误

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_

我使用的是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_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_游标,以便我当前工作测试另一种方法。假设我们在表中插入一条记录