當前位置:首頁 » 存儲配置 » oracle存儲過程table

oracle存儲過程table

發布時間: 2022-09-10 16:37:41

❶ oracle 存儲過程 怎麼用內存表

一 臨時表語法

臨時表只在Oracle 8i 以及以上產品中支持。

語法:

<textarea cols="50"
rows="15" name="code" class="java:showcolumns">create global
temporary table 臨時表名 on commit preserve/delete rows
--preserve:SESSION級的臨時表,delete:TRANSACTION級的臨時表.</textarea>

SESSION級的臨時表數據在整個SESSION都存在,直到結束此次SESSION;而TRANSACTION級的臨時表數據在
TRANACTION結束後消失,即COMMIT/ROLLBACK或結束SESSION都會清除TRANACTION臨時表數據。

當會話退出或者用戶提交commit和回滾rollback事
務的時候,臨時表的數據自動清空,但是臨時表的結構以及元數據還存儲在用戶的數據字典中。當一個會話結束(用戶正常退出、用戶不正常退出、ORACLE實
例崩潰)或者一個事務結束的時候,Oracle對這個會話的表執行 TRUNCATE
語句清空臨時表數據,但不會清空其它會話臨時表中的數據。臨時表可以使用觸發器。

二 臨時表ORACLE資料庫sqlserver的區別

ORACLE臨時表,transaction或者session結束,會清空表數據。但是表還存在。

SQL SERVER臨時表,存儲在 tempdb 中,當不再使用時會自動刪除。

1 SQL SERVER臨時表是一種」內存表」,表是存儲在內存中的。ORACLE臨時表除非執行DROP TABLE,否則表定義會保留在數據字典中;

2 SQL SERVER臨時表不存在類似ORACLE臨時表事務級別上的功能;

3 SQL SERVER本地臨時表(#) 與 ORACLE的會話級別臨時表類似,但是在會話退出的時候,SQL SERVER會自動刪除,ORACLE不會刪除表;

4 SQL SERVER的全局臨時表(##) 是指多個連接共享同一片內存。當沒有指針引用該內存區域時,SQL SERVER自動釋放全局臨時表。

ORACLE不是一種內存中的資料庫,所以如果ORACLE類似SQL SERVER 頻繁的對臨時表進行建立和刪除,必定會影響性能。所以ORACLE會保留臨時表的定義直到用戶DROP TABLE。

在ORACLE中,如果需要多個用戶共享一個表(類似
SQL
SERVER的全局臨時表##),則可以利用永久表,並且在表中添加一些可以唯一標識用戶的列。利用觸發器和視圖,當用戶退出的時候,根據該登陸用戶的唯
一信息刪除相應的表中的數據。 但這種方法給ORACLE帶來了一定量的負載。

三 使用

1 判斷表不存在就創建表

<textarea cols="50" rows="15" name="code" class="java:showcolumns:firstline[1]">create ...
is
temptable_name varchar2(20);
v_count number(1);
begin
temptable_name := 'TEMP_TABLENAME';
select count(*) into v_count from tab where tname = temptable_name;
if(v_count = 0) then
execute immediate 'create table ...';
else
--其他表存在的操作
end if;</textarea>

2 注意使用時,可能會產生的錯誤:ORA-08103: object no longer
exists,ORA-14452 attempt to create, alter or drop an index on temporary
table already in use

ORA-14452 : 通過1的判斷,一般會解決該問題。如果在表使用時,執行刪除表操作,會出現該錯誤。

ORA-08103 : 使用事務級的臨時表時,如果,事務提交前執行刪除表操作或者在事務提交以後使用,就會產生這樣的問題。改成會話級別的可以解決這個問題,但是在會話級別的數據的正確性,可能會因為使用連接池,同一個會話中不同操作而產生錯誤。

❷ 用oracle存儲過程將一張表的數據查出插入另一張表

1、創建測試表,

create table test_tbl_1(id number, value varchar2(20));

create table test_tbl_2(id number, value varchar2(20));

❸ oracle的存儲過程中不能alter table嗎,還是有什麼技巧

create or replace procere demoisbeginalter table aa add(age number);end;/就是這么簡單的一個存儲過程,編譯的時候報告 4/2 PLS-00103: 出現符號"ALTER"在需要下列之一時: begindeclareexitforgotoif <an identifier> <a double-quoted delimited-identifier><a bind variable><< commit<a single-quoted SQL string>

❹ oracle存儲過程動態建表

需要用到動態sql。

1、首先要給用戶賦予許可權:

grantcreateanytableto用戶名;

2、創建存儲過程:

createprocerep_create_table
(v_sqlvarchar2)--輸入建表語句
as
begin
executeimmediatev_sql;
end;

3、執行:

❺ oracle如何執行存儲過程以及如何返回一個table

-- 定義類型
CREATE OR REPLACE TYPE MyTable AS OBJECT(A int, B int, C int);
/
CREATE OR REPLACE TYPE MyTableResult IS TABLE OF MyTable;
/
CREATE OR REPLACE FUNCTION getTestTable return MyTableResult
IS
-- 預期返回結果.
return_Result MyTableResult := MyTableResult();
BEGIN
-- 結果追加一行.
return_Result.EXTEND;
-- 設置結果內容.
return_Result(return_Result.COUNT) := MyTable(A => 1, B=>2, C=>3);
-- 結果追加一行.
return_Result.EXTEND;
-- 設置結果內容.
return_Result(return_Result.COUNT) := MyTable(A => 4, B=>5, C=>6);
-- 結果追加一行.
return_Result.EXTEND;
-- 設置結果內容.
return_Result(return_Result.COUNT) := MyTable(A => 7, B=>8, C=>9);
return return_Result;
END getTestTable;
/
SQL> SELECT
2 A, B, C
3 FROM
4 table( getTestTable() );
A B C
---------- ---------- ----------
1 2 3
4 5 6
7 8 9
SQL>

❻ java怎樣接受oracle資料庫的存儲過程所返回的Table類型數據和array

給你段代碼參考,絕對可以:
使用cs.registerOutParameter(2, OracleTypes.STRUCT, DBI.TYPE.T_SMS_TASK);
OracleTypes.STRUCT,表示自定義的table類型, DBI.TYPE.T_SMS_TASK這個是你在oracle裡面創建的類型。
我這里相當於返回了一個 自定義的type的index by 表。

public static SMSTaskObj selectSmsTask(int terminateTime) {
ICallableStatement cs = null;
SMSTaskObj taskObj = null;
try {
cs = DbFactory.getInstance().getCallableStatement(
DBI.SERVER_DB_NAME, PROC_SEL_SMS_TASK);

cs.setInt(1, terminateTime);
cs.registerOutParameter(2, OracleTypes.STRUCT, DBI.TYPE.T_SMS_TASK);
cs.registerOutParameter(3, OracleTypes.INTEGER);
cs.execute();

int retVal = cs.getInt(3);

if (retVal != 0) {
throw new Exception("Oracle procere PROC_SEL_SMS_TASK error!");
}

STRUCT struct = (STRUCT) cs.getObject(2);

Datum[] dt = struct.getOracleAttributes();

if (String.valueOf(dt[0].bigDecimalValue()).equals("-1")) {
return null;
}

taskObj = new SMSTaskObj();

taskObj.setTaskId(String.valueOf(dt[0].bigDecimalValue()));
taskObj.setTempId(String.valueOf(dt[1].bigDecimalValue()));
taskObj.setUserGroupId(String.valueOf(dt[2].bigDecimalValue()));
taskObj.setUserId(String.valueOf(dt[3].bigDecimalValue()));
taskObj.setTempContent(dt[4].toString());
taskObj.setParamAmount(dt[5].intValue());
taskObj.setPriorityLevel(String.valueOf(dt[6].intValue()));

} catch (Exception ex) {
log.error(ex);
} finally {
try {
if (cs != null)
cs.close();

} catch (SQLException sqle) {
log.error(sqle);
}
}
return taskObj;
}

❼ oracle的存儲過程中不能alter table嗎,還是有什麼技巧

create or replace procere demoisbeginalter table aa add(age number);end;/就是這么簡單的一個存儲過程,編譯的時候報告 4/2 PLS-00103: 出現符號"ALTER"在需要下列之一時: begindeclareexitforgotoif

❽ java怎樣接受oracle資料庫的存儲過程所返回的Table類型數據

先在Oracle中建立視圖,利用Oracle的PLSQL編寫視圖來顯示存儲過程的內容,再用Java訪問沒問題的。

熱點內容
python中或者怎麼表示 發布:2025-01-13 16:32:33 瀏覽:288
易達加密鎖 發布:2025-01-13 16:27:23 瀏覽:514
前端編譯工具配置 發布:2025-01-13 16:26:43 瀏覽:585
資料庫百度雲 發布:2025-01-13 16:19:38 瀏覽:539
java連接sqlite資料庫 發布:2025-01-13 16:19:36 瀏覽:768
htmlajax上傳文件 發布:2025-01-13 16:19:33 瀏覽:514
安卓怎麼時間顯秒 發布:2025-01-13 16:19:33 瀏覽:474
我的世界java伺服器管理員設置 發布:2025-01-13 16:18:44 瀏覽:493
大秦國之裂變ftp 發布:2025-01-13 15:59:01 瀏覽:371
谷能壓縮機 發布:2025-01-13 15:44:30 瀏覽:413