【问题标题】:Execute immediate Oracle立即执行 Oracle
【发布时间】:2013-12-22 16:23:29
【问题描述】:

我正在尝试执行 EXECUTE IMMEDIATE 语句。但我收到以下错误。我正在尝试这个新的,我阅读了现有的帖子。

在看到以下示例后,我正在尝试这个。 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 作为表名传递,将 CNTRYID 作为列名传递

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 行 在 CNTRYID

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;

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    您添加的链接如下:

    您不能使用绑定参数将架构对象的名称传递给 动态 SQL 语句。

    很遗憾,您不能对表名和列名使用绑定变量。您必须将它们串联起来:

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

    并通过以下方式使用 EXECUTE IMMEDIATE:

    EXECUTE IMMEDIATE Query1 INTO Result1;
    

    【讨论】:

    • 我试过这个选项这也不起作用。连接到数据库 oraclesrv.local。 ORA-00905:缺少关键字 ORA-06512:在“mmm.Maxtable”第 19 行 ORA-06512:在第 9 行 SELECT max(COUNTRYID) INTO Result1 FROM COTRY WHERE CNTRYID
    • 我不确定您是否可以在 EXECUTE IMMEDIATE 中使用 SELECT INTO。您应该使用 EXECUTE IMMEDIATE 的 INTO,如链接所示:EXECUTE IMMEDIATE sql_stmt INTO emp_rec USING emp_id;
    【解决方案2】:
    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))';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 2019-10-27
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      • 2020-03-19
      相关资源
      最近更新 更多