如何在动态SQL中将表名作为输入传递?

时间:2016-06-20 16:59:28

标签: sql oracle 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_()的不同数据库,其中括号可能包含不同的名称,如学生,教授,学者等。我希望用户定义表的名称,如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

那我有什么不对劲吗?任何帮助将不胜感激。

1 个答案:

答案 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作为该匿名块的简写)