當前位置:首頁 » 存儲配置 » oracle存儲過程傳入數組

oracle存儲過程傳入數組

發布時間: 2025-01-24 06:49:26

A. oracle存儲過程中怎麼理解傳入傳出參數(in out)

Oracle 過程中定義了in|out|in out3中參數模式,每個參數可以選擇其一
in 是參數的默認模式,這種模式就是在程序運行的時候已經具有值,在程序體中值不會改變。
舉個例子
create or replace procere update_price(
p_proct_id in NUMBER,
p_factor in NUMBER)
AS
.....
你在引用這個過程的時候給參數傳入值
exexute update_price(2,2.5);
這是定義的2個參數就得到了值,in模式下值不能變

out模式定義的參數只能在過程體內部賦值,表示該參數可以將某個值傳遞回調用他的過程
in out 表示高參數可以向該過程中傳遞值,也可以將某個值傳出去

B. oracle資料庫如何利用存儲過程向表中添加數據

實際上存儲過程向表中插入數據和sql執行的區別是不大的,只不過是存儲過程是用loop等循環插入,之後順序執行sql語句,不用命令行執行。

_data_4_pressure_3
is

--Result1VARCHAR2(50);
VAR_numnumber;
begin
VAR_num:=1;

while
VAR_num<1000000
LOOP
insertintorp_trans_log_day
(trans_time,
trans_province,
trans_type,
score_range,
rule_name,
trans_num)
selectto_date('2013/10/29','yyyy-mm-dd'),
round(dbms_random.value(1,300))||'省',
round(dbms_random.value(1,800))||'類型',
round(dbms_random.value(1,100))||'風險分值',
round(dbms_random.value(1,300))||'規則名稱',
'1'
fromal;
commit;
VAR_num:=VAR_num+1;
endloop;

endinsert_data_4_pressure_3;

C. oracle資料庫存儲過程問題: 傳入一個字元串(字元串格式如:「辣椒_食品,西紅柿_食品,板鞋_

數組在Oracle裡面使用不怎麼方便,一般情況下很少使用,給你提個新方法實現你的功能。

設定資料庫結構:

CREATETABLEGOODS
(
PMVARCHAR2(20BYTE),--品名
FLVARCHAR2(20BYTE),--分類
RQDATE,--日期
BZVARCHAR2(50BYTE)--備注
);

存儲過程如下:

CREATEORREPLACEprocerePROC_split(In_StringINVARCHAR2)is
v_split1VARCHAR2(10)DEFAULT',';
v_split2VARCHAR2(10)DEFAULT'_';
lenNUMBERDEFAULT0;
nStrVARCHAR2(200);
nStr1VARCHAR2(40);
nStr2VARCHAR2(20);
nStr3VARCHAR2(20);

placeNUMBER(10)default1;
begin
--輸入串格式
--'辣椒_食品,西紅柿_食品,板鞋_服飾,植物油_食品,領帶_食品,'
len:=length(In_String);
IFlen<1THEN
RETURN;
ENDIF;
nStr:=In_String;
place:=INSTR(nStr,v_split1,1,1);
WHILE(place>0)
LOOP
nStr1:=SUBSTR(nStr,1,place-1);
nStr:=SUBSTR(nStr,place+1);

place:=INSTR(nStr1,v_split2,1,1);
IF(place>0)THEN
nStr2:=SUBSTR(nStr1,1,place-1);
nStr3:=SUBSTR(nStr1,place+1);
UPDATEgoodsSETrq=SYSDATEWHEREpm=nStr2ANDfl=nStr3;
//dbms_output.put_line('nStr2=['||nStr2||'],nStr3=['||nStr3||']');
ENDIF;
place:=INSTR(nStr,v_split1,1,1);
ENDLOOP;
COMMIT;
endPROC_split;
/

測試語句:

DECLARE
IN_STRINGVARCHAR2(32767);

BEGIN
IN_STRING:='辣椒_食品,西紅柿_食品,板鞋_服飾,植物油_食品,領帶_食品,';
PROC_SPLIT(IN_STRING);
COMMIT;
END;

我的調試輸出是:

nStr2=[辣椒],nStr3=[食品]
nStr2=[西紅柿],nStr3=[食品]
nStr2=[板鞋],nStr3=[服飾]
nStr2=[植物油],nStr3=[食品]
nStr2=[領帶],nStr3=[食品]

這裡面只用了兩個函數:INSTR,SUBSTR.

D. oracle存儲過程的in out 值傳遞,這是怎麼傳遞的看不懂啊

p_user_name的IN,表示這個參數是傳入參數。

p_out_val的OUT,表示這個是傳出參數。也就是java中return的值。

p_inoutval的IN OUT,表示這個既是傳入、又是傳出參數。也就是說,你可以利用它傳入該存儲過程,然後接到處理後的這個參數。一個參數搞定了2項功能(傳入,傳出)

E. oracle 存儲過程,如何傳入一個數組

這個是不行的,數組內容必須首先在存儲過程里定義好數組類型,然後給予定義好的數據類型定義數組型變數。存儲過程的入參是做不到的。一般情況下,採用字元串的方式,並給每項用特定的分隔符的方式傳入,然後在存儲過程中按照分隔符解析出每一項,插到存儲過程的定義的數組的每一項上去。

F. oracle存儲過程傳入一個字元串參數'1,2,3,4,5,6,7,8',如何分割並轉為數字

create or replace type type_split as table of varchar2(50); --創建一個type,如果為了使split函數具有通用性,請將其size 設大些。

--創建function
create or replace function split
(
p_list varchar2,
p_sep varchar2 := ','
) return type_split pipelined
is
l_idx pls_integer;
v_list varchar2(50) := p_list;
begin
loop
l_idx := instr(v_list,p_sep);
if l_idx > 0 then
pipe row(substr(v_list,1,l_idx-1));
v_list := substr(v_list,l_idx+length(p_sep));
else
pipe row(v_list);
exit;
end if;
end loop;
return;
end split;

使用:
select * from table(split('1,2,3,4,5,6,7,8'
,','));
然後就可以通過「,」來分割數字了

G. oracle測試存儲過程傳入數組怎麼傳

這個是我自己寫的一個例子,你看看:
在命令窗口執行以下語句,創建自定義類型NESTEDARRAY。
create or replace TYPE NESTEDARRAY IS TABLE OF NUMBER;

在存儲過程中使用自定義類型NESTEDARRAY。
PROCEDURE GET_ARR_RESULT(INPUTARRAY IN NESTEDARRAY, AR OUT NESTEDARRAY) IS
BEGIN
AR := NESTEDARRAY();

FOR I IN 1 .. INPUTARRAY.COUNT LOOP
AR.EXTEND;
AR(I) := I|| INPUTARRAY(I);
END LOOP;
END GET_ARR_RESULT;

Java代碼:
import java.sql.Connection;
import java.sql.SQLException;

import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
import oracle.sql.Datum;

/**
* Java獲取Oracle存儲過程返回自定義類型
* @author lucky star
*
*/
public class OracleTypeResultTest {

/**
* @param args
*/
public static void main(String[] args) {
Connection con = null;
OracleCallableStatement ocs = null;
String sql = "{call test.GET_ARR_RESULT(?,?)}";

try {
con = DBUtil.dbUtil.getConnection();
ocs = (OracleCallableStatement) con.prepareCall(sql);
String[] params = {「10001」,」10003」};
ArrayDescriptor arrayDesc = ArrayDescriptor.createDescriptor("NESTEDARRAY", con);
ARRAY inputArray = new ARRAY(arrayDesc, con, params);
ocs.setARRAY(1, inputArray);
ocs.registerOutParameter(2,OracleTypes.ARRAY,"NESTEDARRAY");
ocs.execute();

ARRAY array = ocs.getARRAY(2);
Datum[] datum = array.getOracleArray();
for (int i=0;i<datum.length;i++) {
System.out.println(datum[i].intValue());
}

} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if(ocs!=null)ocs.close();
if(con!=null)con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

}

用VARCHAR2測試,發現存儲過程中無法獲取到傳入的數組的值。
不過,將自定義類型由varchar2改成NVarchar2就成功了。

熱點內容
懸賞網源碼 發布:2025-01-24 10:53:14 瀏覽:733
c語言時間變數 發布:2025-01-24 10:40:24 瀏覽:869
ppiandroid 發布:2025-01-24 10:25:50 瀏覽:1000
兒童壓縮機 發布:2025-01-24 10:25:09 瀏覽:74
蘋果的允許訪問在哪裡 發布:2025-01-24 10:24:32 瀏覽:31
橡皮艇存儲 發布:2025-01-24 10:21:56 瀏覽:771
360的新機什麼配置 發布:2025-01-24 10:04:22 瀏覽:951
榮耀10方舟編譯器不卡頓了 發布:2025-01-24 09:59:59 瀏覽:502
章魚腳本助手 發布:2025-01-24 09:55:10 瀏覽:334
手游腳本論壇 發布:2025-01-24 09:54:20 瀏覽:30