oracle存儲過程table
❶ 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訪問沒問題的。