如何将 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)
我正在尝试创建一个动态 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)