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
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硬解析;建议采用绑定变量的办法,不要用表名作参数,表名作参数似乎不能用绑定变量。看有高手能不能解决这个问题。
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
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硬解析;建议采用绑定变量的办法,不要用表名作参数,表名作参数似乎不能用绑定变量。看有高手能不能解决这个问题。
另“oracle硬解析”是什么东东?
当然你说你的表名一直不变的传,比如第一次传'test',第2次还是'test',如果数据库不重启什么的第2次缓冲区就存在了就是软解析。动态SQL不能绑定schema对象