2013-12-22 3 views
3

EXECUTE IMMEDIATE 문을 실행하려고합니다. 하지만 아래 오류가 나타납니다. 나는 이것을 새로운 것으로 시험하고있다, 나는 기존의 글을 읽는다.즉시 실행 Oracle

나는 아래의 예를보고 나서 이것을 시도하고있다. http://docs.oracle.com/cd/B13789_01/appdev.101/b10807/13_elems017.htm

그것은 잘못된 테이블 이름은 말한다, 그러나 표는, 나는 또한이 옵션을 시도

Create OR REPLACE PROCEDURE Maxtable 
    (ITableName   VarChar2, 
    IColumnName VarChar2) 
AS 
Limit1 int; 
RESULT1 INT; 
Query1 varChar(255); 
TableName   VarChar(50); 
    ColumnName VarChar(50); 
BEGIN 
Limit1 := 99999; 
MaxTableId := 0; 
Result1 := 0; 

TableName := ltrim(rtrim(ITableName)); 
ColumnName := ltrim(rtrim(iColumnName)); 
DBMS_OUTPUT.PUT_LINE(TableName || ColumnName); 

IF (TableName is not null and ColumnName is not null) then 
Query1 := 'SELECT MAX(:1) FROM :2 WHERE :1 <= 99999' ; 
DBMS_OUTPUT.PUT_LINE(Query1); 

EXECUTE IMMEDIATE Query1 INTO Result1 USING ColumnName, TableName;        
END IF; 

DBMS_OUTPUT.PUT_LINE(Result1); 

MaxTableId := Result1; 

IF (MaxTableId = Limit1) THEN 
    MaxTableId := -1; 
ELSE 
    MaxTableId := MaxTableId + 1 ; 
END IF; 

END adm_getMaxTableIdLimited; 

내가 COLUMNNAME AS TABLE NAME, CNTRYID AS CNTRY을 전달하고

Connecting to the database Local 
ORA-00903: invalid table name 
ORA-06512: at "MMM.Maxtable", line 26 
ORA-06512: at line 9 
CNTRYCNTRYID 
SELECT MAX(:1) FROM :2 WHERE :1 <= 99999 
Process exited. 
Disconnecting from the database oraclesrv.local. 

존재의 작동하지 않습니다.

데이터베이스에 연결 중입니다. ORA-00905 : 누락 키워드 ORA-06512 "mmm.Maxtable"에서, 라인 (19) ORA-06512 : 라인 9 SELECT 최대 CNTRYID < = 99999 프로세스 종료 CNTRY FROM 결과 1 INTO (CNTRYID)에서. 데이터베이스 oraclesrv.local에서 연결을 끊습니다.

Create OR REPLACE PROCEDURE Maxtable 
    (TableName   VarChar2, 
    ColumnName VarChar2, 
    MaxTableId OUT Int) 
AS 
Limit1 int; 
RESULT1 INT; 
Query1 varChar(255); 
BEGIN 
Limit1 := 99999; 
MaxTableId := 0; 
Result1 := 0; 

IF (TableName is not null and ColumnName is not null) then 
Query1 := 'SELECT max(' || ColumnName || ') INTO Result1' || ' FROM ' || TableName || ' WHERE ' || ColumnName || ' <= ' || 99999 ; 

DBMS_OUTPUT.PUT_LINE(Query1); 

EXECUTE IMMEDIATE Query1; 
END IF; 

DBMS_OUTPUT.PUT_LINE(Result1); 

MaxTableId := Result1; 

IF (MaxTableId = Limit1) THEN 
    MaxTableId := -1; 
ELSE 
    MaxTableId := MaxTableId + 1 ; 
END IF; 

END Maxtable; 

답변

2

추가 한 링크는 다음 말한다 :

당신은 동적 SQL 문에 스키마 객체의 이름을 전달하는 바인드 인자를 사용할 수 없습니다.

불행히도 테이블 이름과 열 이름에는 바인드 변수를 사용할 수 없습니다.

Query1 := 'SELECT MAX(' || ColumnName || ') FROM ' || TableName || ' WHERE ' || ColumnName || ' <= 99999' ; 

을 그리고 즉시에게 다음과 같은 방법을 EXECUTE 사용 : 당신이 가지고 그들을 문자열 연결하여

EXECUTE IMMEDIATE Query1 INTO Result1; 
+0

가 나는 또한 작동하지 thisoption이 시도. 데이터베이스 oraclesrv.local에 연결 중입니다. ORA-00905 : 누락 키워드 ORA-06512 "mmm.Maxtable"에서, 라인 (19) ORA-06512 : CNTRYID <= 99999 프로세스 종료 COTRY FROM 광고 결과 1 INTO 9 SELECT 맥스 (COUNTRYID)에서. – user3127462

+0

EXECUTE IMMEDIATE에서 SELECT INTO를 사용할 수 있는지 확신하지 못합니다. EXECUTE IMMEDIATE의 INTO를 사용해야합니다. EXECUTE IMMEDIATE sql_stmt INTO emp_rec USING emp_id; –

0
EXECUTE IMMEDIATE 'drop table tbl_proc_cre_ins purge';--using "EXECUTE IMMEDIATE"; 
EXECUTE IMMEDIATE 'CREATE TABLE tbl_proc_cre_ins(rollno varchar2(100),name varchar2(100))';