我正在尝试创建一个动态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_()的不同数据库,其中括号可能包含不同的名称,如学生,教授,学者等。我希望用户定义表的名称,如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
。
那我有什么不对劲吗?任何帮助将不胜感激。
答案 0 :(得分:1)
错误似乎来自您的通话,而不是程序。你在做:
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作为该匿名块的简写)