select * from 表名变量 可以吗  需要在游标变量中使用 表名变量

解决方案 »

  1.   


    create or replace
    PROCEDURE          "TEST" 
    AS
      TYPE C_TEST IS REF CURSOR;  --要定义成为指针游标
      C_TEST_ C_TEST;         
      
      SQLSTR_ VARCHAR2(100);    --SQL 动态语句
      DATETIME_ DATE;
      TABLE_NAME_ VARCHAR2(10);
    BEGIN
      TABLE_NAME_ := 'DUAL';
      SQLSTR_:='Select sysdate as DateTime from '||TABLE_NAME_;
      
      OPEN C_TEST_ FOR SQLSTR_;  --对于动态语句 只能用这种显式的方法打开游标
      LOOP
        FETCH C_TEST_ INTO DateTime_;  
        EXIT WHEN  C_TEST_%NOTFOUND;  
        DBMS_OUTPUT.PUT_LINE(DateTime_);
      END LOOP;
      
    END TEST;
    --执行语句
    set serveroutput on
    BEGIN
      TEST ;
    END;
    --执行效果匿名块已完成
    05-5月 -10
      

  2.   


    CREATE OR REPLACE PROCEDURE TEST
    IS
      SQLSTR_ VARCHAR2(100);    --SQL 动态语句
      DATETIME_ DATE;
      TABLE_NAME_ VARCHAR2(10);
    BEGIN
      TABLE_NAME_ := 'DUAL';
      SQLSTR_:='Select sysdate fa from '|| TABLE_NAME_;
     EXECUTE IMMEDIATE sqlstr_  INTO DateTime_ ;
     DBMS_OUTPUT.PUT_LINE(DateTime_);END TEST;
    最好不采用这种方式,可能导致oracle硬解析;建议采用绑定变量的办法,不要用表名作参数,表名作参数似乎不能用绑定变量。看有高手能不能解决这个问题。
      

  3.   

    顶1L。
    另“oracle硬解析”是什么东东?
      

  4.   

    使用动态表名,必然导致硬解析,这没有什么好说的。
    当然你说你的表名一直不变的传,比如第一次传'test',第2次还是'test',如果数据库不重启什么的第2次缓冲区就存在了就是软解析。动态SQL不能绑定schema对象