/*使用动态SQL在存储过程中使用临时表 这里有两点值得注意: 1、动态SQL使用存储过程 2、在使用游标时(不能把open for语句也放在字符串里执行,原因不明) */ DECLARE fname VARCHAR2(20); vname VARCHAR2(20); v_cursor hstype.t_cursor; str VARCHAR2(100); n NUMBER(3); BEGIN fname := 'tmpTable'; vname := 'v_cursor'; EXECUTE IMMEDIATE ('CREATE GLOBAL TEMPORARY TABLE tmpTable(userID VARCHAR2(18))'); EXECUTE IMMEDIATE ('INSERT INTO '||fname||' SELECT user_id FROM hs_user.users WHERE ROWNUM<5' ); EXECUTE IMMEDIATE ('SELECT COUNT(*) FROM '||fname) INTO n; str := 'SELECT * FROM hs_user.users WHERE ROWNUM<4'; OPEN v_cursor FOR str; --EXECUTE IMMEDIATE ('OPEN '||vname||' FOR SELECT * FROM hs_user.users WHERE ROWNUM<4'); Dbms_Output.put_line(n); EXECUTE IMMEDIATE ('DROP TABLE '||fname); EXCEPTION WHEN OTHERS THEN Dbms_Output.put_line(SQLCODE||':'||SQLERRM); EXECUTE IMMEDIATE ('DROP TABLE '||fname); END; 前一段时间开发存储过程,在使用临时表的时候遇到了一些麻烦,最后采取了其他动作。今天闲来无事,又开始弄,结果原来在看资料的时候忽视了动态SQL这么回事。今天看书,看到动态SQL这么个概念,查查,然后用用,结果临时表就搞成了,希望对大家会有用。