0

select ステートメントが以下の構造を持つ列の値としてテーブルに格納されているシーンがあります。

 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;

さて、 l_select_stmt で使用できるようになった、フェッチされた select ステートメントの where 句で In_EMP_ID を EMP_ID に割り当てる可能性はありますか?

4

1 に答える 1

1

を使用してその select ステートメントを実行する場合は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. また、この特定の例の列/テーブルの名前の一部を変更してUSINGEXECUTE IMMEDIATE.

出力:

ジョン
于 2013-11-11T13:02:40.597 に答える