2013-12-22 3 views
3

Я пытаюсь выполнить EXECUTE IMMEDIATE Statement. Но я получаю следующую ошибку. Я пытаюсь это как новое, я читаю существующие сообщения.Выполнение немедленного Oracle

Я пробую это, увидев приведенные ниже примеры. http://docs.oracle.com/cd/B13789_01/appdev.101/b10807/13_elems017.htm

Это говорит недопустимое имя таблицы, но таблица присутствует

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. 

Я передаю Cntry AS TABLE NAME, CNTRYID AS ColumnName

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; 

Я попробовал этот вариант также, его не работает.

Подключение к базе данных. ОР-00905: отсутствуют ключевое слово ОР-06512: на "mmm.Maxtable", строка 19 ОР-06512: в строке 9 SELECT MAX (CNTRYID) в result1 ОТ Cntry ГДЕ CNTRYID < = 99999 Процесс завершается. Отключение из базы данных 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. ОР-00905: отсутствует ключевое слово ОР-06512: на "mmm.Maxtable", строка 19 ОР-06512: в строке 9 SELECT MAX (CountryId) в result1 ОТ Cotry ГДЕ CNTRYID <= 99999 Процесс завершается. – user3127462

+0

Я не уверен, что вы можете использовать SELECT INTO в EXECUTE IMMEDIATE. Вы должны использовать INTO EXECUTE IMMEDIATE, например, ссылку: EXECUTE IMMEDIATE sql_stmt INTO emp_rec ИСПОЛЬЗОВАНИЕ 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))'; 
Смежные вопросы