create procedure test(table_name)
as
open cursor_mycursor for select colunm1,colunm2 from :table_name;
begin
end;出错:编译时table_name未定义。
如何解决??
谢谢!!

解决方案 »

  1.   


    表名、字段名都不能为变量,在嵌入式SQL语句中,如果实现动态表名以及字段名需要使用动态SQL语句。
    即构造一个字符串,然后execute.
      

  2.   

    楼上说的都对,
    以下是先前见过 的一个例子,供 lz参考:
    --===================动态SQL=================--
    VARIABLE maxsal NUMBER; --声明变量
    EXECUTE :maxsal := 2500; --执行引用并给变量赋值
    DECLARE
       r_emp EMP%ROWTYPE; --声明一个行类型变量
       TYPE c_type IS REF CURSOR; --声明REF游标类型
       cur       c_type; --声明REF游标类型的变量
       p_salary NUMBER; --声明一个标量变量
    BEGIN
       p_salary := :maxsal; --引用变量
       --使用USING语句将引用到的值传给动态SQL语句'SAL >: 1'中的'1'
       OPEN cur FOR 'SELECT * FROM EMP WHERE SAL >: 1 ORDER BY SAL DESC'
         USING p_salary;
       DBMS_OUTPUT.PUT_LINE('薪水大于' || p_salary || '的员工有:');
       LOOP
         FETCH cur
           INTO r_emp;
         EXIT WHEN cur%NOTFOUND;
         DBMS_OUTPUT.PUT_LINE('编号:' || r_emp.empno || '姓名:' || r_emp.ename ||
                              '薪水:' || r_emp.sal);
       END LOOP;
       CLOSE cur; --关闭游标
    END;