2016-06-20 2 views
1

ID가 주어진 첫 번째 이름을 가져 오기 위해 동적 SQL 프로 시저를 만들려고합니다.동적 SQL에서 테이블 이름을 입력으로 전달하는 방법은 무엇입니까?

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; 

내가 브래킷 등 학생, 교수, 학자와 같은 5 월 다른 이름이 들어있는 타입 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

' MIN_NBR 번호를 선언; 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; ' –

+0

그게 내가 실행중인 절차이고 다음과 같은 오류가 발생합니다 : "식별자 학생을 선언해야합니다" –

+0

질문을 편집하여 서식을 지정해야하는 추가 정보, 특히 코드를 추가하십시오. –

답변

1

오류가 절차에서가 아니라 사용자의 전화에서 온 것 같습니다.

FIELD_NAME := &FIELD_NAME; 

하지만 당신은 문자열을 할당하고, 그래서 당신은 대체 변수 주위에 따옴표가 필요합니다 : 당신이하고있는 당신이 '돈 OUT 매개 변수를 추가하려고하지 않는 한

FIELD_NAME := '&FIELD_NAME'; 

을 정말로 로컬 변수가 필요합니다. 당신이 할 수 있습니다

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

(당신이 한 줄에 그것을 얻을, 또는 연속 문자를 사용할 수 있다면, 당신은 익명 블록에 대한 속기로 execute in SQL*Plus or SQL Developer를 사용할 수 있습니다)

+0

감사합니다. 제안을 모두 구현했으며 현재 작동 중입니다. –