2013-12-22 152 views
3

我正在尝试执行EXECUTE IMMEDIATE语句。但是我得到了下面的错误。我正在尝试这个新的,我读了现有的职位。立即执行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表名,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; 

我已经试过这个选项也,其不工作..

连接到数据库。 ORA-00905:缺少关键字 ORA-06512:在 “mmm.Maxtable”,第19行 ORA-06512:在第9行 SELECT MAX(CNTRYID)INTO结果1 FROM CNTRY WHERE 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 IMMEDIATE方式如下:

EXECUTE IMMEDIATE Query1 INTO Result1; 
+0

我试图thisoption这也不能正常工作。连接到数据库oraclesrv.local。 ORA-00905:缺少关键字 ORA-06512:在 “mmm.Maxtable”,第19行 ORA-06512:在第9行 SELECT MAX(COUNTRYID)INTO结果1 FROM COTRY WHERE CNTRYID <= 99999 过程退出。 – 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))';