CREATE OR REPLACE PROCEDURE SP_HSA_Get_Income0421_TEST(
DATA1 OUT SYS_REFCURSOR) IS
BEGIN
DECLARE V_STR VARCHAR2(4000);
TABLECOUNT NUMBER;
TEMP_COUNT NUMBER;
V_TEMP_TABLENAME_01 VARCHAR(20);
V_TEMP_TABLENAME_02 VARCHAR(20);
V_STR_CLOB clob;
V_STR_01 VARCHAR2(4000);
BEGIN
V_TEMP_TABLENAME_01 := 'CT_'||SUBSTR(SYS_GUID(),1,8);
SELECT COUNT(1) INTO TABLECOUNT FROM USER_TABLES WHERE TABLE_NAME =V_TEMP_TABLENAME_01;
IF TABLECOUNT>0 THEN
V_STR :='TRUNCATE TABLE '||V_TEMP_TABLENAME_01;
EXECUTE IMMEDIATE V_STR;
V_STR :='DROP TABLE '||V_TEMP_TABLENAME_01;
EXECUTE IMMEDIATE V_STR;
END IF;
EXECUTE IMMEDIATE '
CREATE GLOBAL TEMPORARY TABLE '||V_TEMP_TABLENAME_01||' ON COMMIT PRESERVE ROWS AS
SELECT 1 AS AA, 2 AS BB FROM DUAL';
V_STR_01:='SELECT * FROM '||V_TEMP_TABLENAME_01;
OPEN DATA1 FOR V_STR_01;
SELECT COUNT(1) INTO TABLECOUNT FROM USER_TABLES WHERE TABLE_NAME =V_TEMP_TABLENAME_01;
IF TABLECOUNT>0 THEN
V_STR :='TRUNCATE TABLE '||V_TEMP_TABLENAME_01;
EXECUTE IMMEDIATE V_STR;
V_STR :='DROP TABLE '||V_TEMP_TABLENAME_01;
EXECUTE IMMEDIATE V_STR;
END IF;
END;
END SP_HSA_Get_Income0421_TEST;
DATA1 得不到資料,請各位大俠幫忙,看下是不是哪里寫錯了,或者是不是PLSQL通過臨時表的方式有問題!
uj5u.com熱心網友回復:
會話臨時表,會話結束后會自動清理資料,不需要程式控制truncate 。當你使用游標的時候,要進行語意檢查,發現表物件不存在,就會報錯。
uj5u.com熱心網友回復:
我現在這個寫法,DATA1 獲取不到對應的值,這個是什么原因呢!uj5u.com熱心網友回復:
有大俠提供思路嗎uj5u.com熱心網友回復:
再加一個程序用來drop臨時表,你將現在程序臨時表的表名作為出參,使用完游標資料以后,然后再掉drop程序uj5u.com熱心網友回復:
因為你把這個表洗掉了,游標獲取資料,是你把他打開的時候才會獲取資料。和視圖差不多的,不會存資料的。報的錯是找不到表uj5u.com熱心網友回復:
SYS_REFCURSOR 型別的游標屬于弱型別,在OPEN時,才會去執行這個實際的陳述句,也就是說才去做語法檢查。后面的你洗掉掉了要參考的,肯定就查不到了,并且報一個表不存在的錯誤。
實際上,臨時表的使用標準應該是這樣:先在資料庫中把臨時表建好,而不是在存盤中去動態去創建它。
建議參考一下 1# 和5# 回復。
uj5u.com熱心網友回復:
按你的方式,會不會導致這個存盤程序同時被呼叫時,資料會錯亂!導致取出的資料有問題?
在SQL SERVER里面 #TEMP這種臨時表,每次用完就自動洗掉!
uj5u.com熱心網友回復:
不會的,oracle 的臨時表,各個會話的資料是隔離的,也就是 會話1 無論如何也是查不S2 的資料的。 反而是這種動態創建的方式,在并發時會互相影響。
PS: Oracle 和 SQL Server 在臨時表的使用上區別還是很大的。
uj5u.com熱心網友回復:
sqlsevr 使用臨時表必須要起別名,oracle不需要轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/13081.html
標籤:基礎和管理
上一篇:Oracle索引
