0

我有一个场景,其中我的选择语句存储为表中具有以下结构的列值。

 Id               Query
 ----             -----
 1                SELECT * FROM EMP WHERE EMP_ID= In_EMP_ID

我有一个过程,其中 empid 作为参数传递,过程中的游标根据此处为 1 的 Id 从表 EMP 中获取上面的 select 语句。

程序是

  Create or replace procedure EMP (In_EMP_ID IN NUMBER)
  AS
  CURSOR get_stmt(id IN VARCHAR2) IS 
  SELECT Query from EMP WHERE id = id;

  l_select_stmt varchar2(200);
  BEGIN

  OPEN get_stmt(1);
  Fetch get_stmt into l_select_stmt;

  END;

现在,是否有可能将 In_EMP_ID 分配给 EMP_ID 在我获取的 select 语句的 where 子句中,该语句现在在 l_select_stmt 中可用?

4

1 回答 1

1

如果要使用 执行该选择语句EXECUMTE IMMEDIATE,则可以使用绑定变量来传递 ID。例子:

CREATE TABLE my_queries (
  id NUMBER,
  my_query VARCHAR2(200)
);

INSERT INTO my_queries VALUES (1, 'SELECT fname FROM EMP WHERE EMPID = :In_EMP_ID');
COMMIT;

CREATE OR REPLACE PROCEDURE emp_proc(In_EMP_ID IN NUMBER)
AS
  CURSOR get_stmt(id_par IN VARCHAR2) IS 
    SELECT my_query FROM my_queries WHERE id = id_par;

  l_select_stmt varchar2(200);
  l_name VARCHAR2(40);
BEGIN
  OPEN get_stmt(1);
  FETCH get_stmt INTO l_select_stmt;

  EXECUTE IMMEDIATE l_select_stmt 
    INTO l_name
    USING IN in_emp_id;

  dbms_output.put_line(l_name);
END;
/

EXEC emp_proc(1);

请注意,在查询中,您现在拥有:in_emp_id的不仅仅是in_emp_id. 另请注意,我已更改此特定示例的一些列/表的名称,只是为了展示如何USING使用EXECUTE IMMEDIATE.

输出:

约翰
于 2013-11-11T13:02:40.597 回答