如何将 table 名称作为动态 SQL 中的输入传递?

How to pass table name as an input in dynamic SQL?

我正在尝试创建一个动态 SQL 程序来获取给定 ID 的名字。

CREATE OR REPLACE PROCEDURE SELECT_12 
(
  MIN_NBR NUMBER  
, BORR_FST_NM VARCHAR2  
, FIELD_NAME VARCHAR2
) IS 
TYPE cur_type IS REF CURSOR;
C_1 CUR_TYPE;
QUERY_STR VARCHAR2(1000);
FIRST_NAME VARCHAR(1000);
BEGIN
QUERY_STR:= 'SELECT BORR_FST_NM from MON_DD_DDS.' || field_name ||'
 WHERE   MIN_NBR = :MINNBR';
   OPEN C_1 FOR QUERY_STR USING MIN_NBR;
LOOP
 FETCH C_1 INTO FIRST_NAME;
 EXIT WHEN C_1%NOTFOUND;
 DBMS_OUTPUT.PUT_LINE(FIRST_NAME);
END LOOP;
NULL;
END SELECT_12;

我有不同的数据库,类型为 MON_DD_DMS.STAGE_MRE_(),其中括号包含可能不同的名称,如学生、教授、学者等。我希望用户定义 table 的名称比如 MON_DD_DMS.STAGE_MRE_STUDENT 和 MON_DD_DMS.STAGE_MRE_PROFESSOR 等等

当我尝试 运行 程序时:

DECLARE
  MIN_NBR NUMBER;
  BORR_FST_NM VARCHAR2(200);
  FIELD_NAME VARCHAR2(200);
BEGIN
  FIELD_NAME := &FIELD_NAME;
  MIN_NBR := &MIN_NBR;
  BORR_FST_NM := NULL;

  SELECT_12( MIN_NBR => MIN_NBR, BORR_FST_NM => BORR_FST_NM,
    FIELD_NAME => FIELD_NAME );
END;

它说STAGE_MRE_student必须声明。

所以我做错了什么吗?任何帮助将不胜感激。

错误似乎来自您的调用,而不是程序。你在做:

FIELD_NAME := &FIELD_NAME;

但是你要分配一个字符串,所以你需要在替换变量周围加上单引号:

FIELD_NAME := '&FIELD_NAME';

除非您打算添加一个 OUT 参数,否则您实际上并不需要局部变量;你可以这样做:

BEGIN
  SELECT_12( MIN_NBR => &MIN_NBR, BORR_FST_NM => NULL,
    FIELD_NAME => '&FIELD_NAME' );
END;

(如果你能在一行中得到它,或者使用一个连续字符,你可以使用 execute in SQL*Plus or SQL Developer 作为那个匿名块的 shorthand)