當前位置:首頁 » 存儲配置 » oracle存儲過程變數定義

oracle存儲過程變數定義

發布時間: 2022-12-09 06:33:47

『壹』 oracle存儲過程基本語法

一:存儲過程

創建存儲過程,需要有CREATE PROCEDURE或CREATE ANY PROCEDURE的系統許可權   

刪除存儲過程,是過程的創建者或者擁有DROP ANY PROCEDURE系統許可權 

修改存儲過程,則只能是過程的創建者或者擁有ALTER ANY PROCEDURE系統許可權的人

執行(或調用)存儲過程,是過程的創建者或是擁有EXECUTE ANY PROCEDURE系統許可權的人或是被擁有者授予EXECUTE許可權的人

1:語法

 1)創建

CREATE[ORREPLACE]PROCEDURE存儲過程名[(參數[IN|OUT|INOUT] 數據類型...)]

{AS|IS}

[說明部分]

BEGIN

可執行部分

[EXCEPTION

錯誤處理部分]

END[過程名];

 說明:

   OR REPLACE 表示如果存在就覆蓋存儲過程

   參數有三種形式:IN、OUT和IN OUT。則默認為IN。

  關鍵字AS也可以寫成IS,後跟過程的說明部分,可以在此定義過程的局部變數。

2)刪除存儲過程:

DROP PROCEDURE 存儲過程名;

3)修改存儲過程:

      ALTER PROCEDURE 存儲過程名 COMPILE; 

4)執行存儲過程

      EXECUTE 模式名.存儲過程名[(參數...)]; 

     或

       BEGIN 

模式名.存儲過程名[(參數...)];

END;

另外:參數可以是變數、常量或表達式

 要其它用戶執行存儲過程須要給其它用戶授權

GRANT EXECUTE ON 存儲過程名 TO 用戶名

 2:參數說明

IN 定義一個輸入參數變數,用於傳遞參數給存儲過程

OUT 定義一個輸出參數變數,用於從存儲過程獲取數據

IN OUT 定義一個輸入、輸出參數變數,兼有以上兩者的功能

 1)參數名 IN 數據類型 DEFAULT 值;

          定義一個輸入參數變數,用於傳遞參數給存儲過程。

          可以是常量、有值變數或表達式

          DEFAULT 關鍵字為可選項,用來設定參數的默認值。如果在調用存儲過程時不指明參數,則參數變數取默認值

          在存儲過程中,輸入變數接收主程序傳遞的值,但不能對其進行賦值。

2)參數名 OUT 數據類型;

          定義一個輸出參數變數,用於從存儲過程獲取數據,即變數從存儲過程中返回值給主程序。

          在調用存儲過程時,主程序的實際參數只能是一個變數,而不能是常量或表達式。

          在存儲過程中,參數變數只能被賦值而不能將其用於賦值,而且必須給輸出變數至少賦值一次。

3)參數名 IN OUT 數據類型 DEFAULT 值; 

          定義一個輸入、輸出參數變數,兼有以上兩者的功能。

          在調用存儲過程時,主程序的實際參數只能是一個變數,而不能是常量或表達式。

          DEFAULT 關鍵字為可選項,用來設定參數的默認值。

          在存儲過程中,變數接收主程序傳遞的值,同時可以參加賦值運算,也可以對其進行賦值。在存儲過程中必須給變數至少賦值一次。

補充:如果省略IN、OUT或IN OUT,則默認模式是IN。 

          調用它時參數個數與位置可以不一致,用以下形式調用:

EXECUTE CHANGE_SALARY(P_RAISE=>80,P_EMPNO=>7788);  //=>運算符左側是參數名,右側是參數表達式

 二:函數

創建函數,需要有CREATE PROCEDURE或CREATE ANY PROCEDURE的系統許可權

刪除函數,需要是函數的創建者或者是擁有DROP ANY PROCEDURE系統許可權的人

修改函數,需要是函數的創建者或者擁有ALTER ANY PROCEDURE系統許可權的人

執行函數,需要是函數的創建者或擁有EXECUTE ANY PROCEDURE系統許可權的人

1:語法

1)創建:

CREATE[ORREPLACE]FUNCTION函數名[(參數[IN] 數據類型...)]

RETURN數據類型

{AS|IS}

[說明部分]

BEGIN

可執行部分

RETURN(表達式)

[EXCEPTION

    錯誤處理部分]

END[函數名];

 說明:

     參數是可選的,但只能是IN類型(IN關鍵字可以省略)。

     在定義部分的RETURN 數據類型,用來表示函數的數據類型,也就是返回值的類型,不可省略。

     在可執行部分的RETURN(表達式),用來生成函數的返回值,其表達式的類型應該和定義部分說明的函數返回值的數據類型一致。在函數的執行部分可以有多個RETURN語句,但只有一個RETURN語句會被執行,一旦執行了RETURN語句,則函數結束並返回調用環境。 

2)刪除

      DROP FUNCTION 函數名;

3)修改

      ALTER PROCEDURE 函數名 COMPILE;

4)執行

      變數名:=函數名(...) 

三:對存儲過程 和 函數的查看(可以通過對數據字典【USER_SOURCE】的訪問來查詢存儲過程或函數的有關信息)

 1:查詢某個存儲過程序內容

select TEXT from user_source WHERE NAME='存儲過程名';

 2:查看數據字殿

DESCRIBE USER_SOURCE ; //命令行中

 3:查看存儲過程的參數

DESCRIBE say_hello; //後面是過程名

 4:查看發生編輯錯誤

SHOW ERRORS ;

 5:查詢一個存儲過程或函數是否是有效狀態(即編譯成功)

SELECT STATUS FROM USER_OBJECTS WHERE OBJECT_NAME='過程名';//注意大小寫

VALID表示該存儲過程有效(即通過編譯),INVALID表示存儲過程無效或需要重新編譯。它的狀態會改變,這與它依賴外部表(表刪除修改等操作)有關系

6:查看存儲過程與表的依賴關系

SELECT REFERENCED_NAME,REFERENCED_TYPE FROM USER_DEPENDENCIES WHERE NAME='SAY_HELLO';

 說明

NAME為實體名,TYPE為實體類型,REFERENCED_OWNER為涉及到的實體擁有者賬戶,REFERENCED_NAME為涉及到的實體名,REFERENCED_TYPE 為涉及到的實體類型。

問題:

如果一個用戶A被授予執行屬於用戶B的一個存儲過程的許可權,在用戶B的存儲過程中,訪問到用戶C的表,用戶B被授予訪問用戶C的表的許可權,但用戶A沒有被授予訪問用戶C表的許可權,那麼用戶A調用用戶B的存儲過程是失敗的還是成功的呢?答案是成功的。

『貳』 oracle 存儲過程

create or replace procere sp_add_emp2( --創建名為sp_add_emp2存儲過程
v_empno emp.empno%type, --------- 傳入存儲過程中的參數
v_ename emp.ename%type,
v_deptno dept.deptno%type,
v_dname dept.dname%type,

num out number ----------存儲過程執行完畢後返回的值
)as
num1 number; ------自定義變數
num2 number;
begin
--查詢dept表中的數據總共有多少行,賦值給num1,
--條件是欄位deptno等於v_deptno(傳進來的參數)
select count(*) into num1 from dept where deptno=v_deptno;
if(num1=0) then --如果沒數據
--則給dept表的deptno 和dname列插入一條數據,值為v_deptno,v_dname
insert into dept(deptno,dname) values(v_deptno,v_dname);
end if; --If語句結束語
---同上。
select count(*) into num2 from emp where empno=v_empno;
if(num2=0)then
insert into emp(empno,ename,deptno) values(v_empno,v_ename,v_deptno);
else --如果查詢到有數據則提示錯誤信息,員工ID重復,不插入數據
raise_application_error(-202021,'員工id 重復!!!');
end if;

num:=num1; --定義的輸出參數等於num1。
commit; --結束存儲過程。

『叄』 新手學習 Oracle存儲過程怎麼編寫

示例參考:
建立存儲過程
CREATE OR REPLACE PROCEDURE P_name--存儲過程名字
(
i_var in int, --輸入參數1
o_var OUT varchar2 --輸出參數1
)
IS
v_STR VARCHAR2(200); --定義存儲過程內部的局部變數
BEGIN
--下面是存儲過程的主體實現部分
v_STR := i_var;
dbms_output.put_line(v_STR);
o_var := v_STR;
exception--錯誤異常處理部分
when others then
dbms_output.put_line(sqlerrm);--列印錯誤信息
END P_name

『肆』 oracle存儲過程

create table dept
(deptno number,
dname varchar2(20),
loc varchar2(20)
)
1.如果你是取出單個的,你可以定義一個或者多個變數,將取出的值賦給變數
例如:

create or replace procere dept_procere(a in varchar2)
is
v_no number;
v_a varchar2(20);
begin
select a.deptno,a.loc into v_no,v_a
from dept a
where a.dname=a;
dbms_output.put_line('學號為:'||v_no||);
end;
2.如果你取出的是一個結果集,你可以用游標(一個簡單的例子)
create or replace procere dept_procere(a in varchar2,v_a out dept%rowtype)
is
--聲明游標
cursor c_de(a in varchar2)
is select * from dept where dname=a;
begin
--打開游標,對其中找到的記錄進行遍歷
open c_de(a);
loop
fetch c_de into v_a;
exit when c_de%notfound;
end loop;
close c_de;
dbms_output.put_line('deptno:'||v_a.deptno);
dbms_output.put_line('dname:'||v_a.dname);
dbms_output.put_line('loc:'||v_a.loc);
end;

3.可注意:在創建存儲過程的時候加上or replace,如果遇到重名的存儲過程將替換掉!
4.定義變數後面記得加上分號
5.oracle中可以對它直接賦值,可不用set, v_a:='a';
(6.給變數賦值的時候注意它的數據類型 a要單引號)
7.如果你這存儲過程是將參數賦值給一個你定義的變數的話,那這樣你不覺得是多此一舉么?一般將參數賦值給你定義的變數的話,可以進行數據類型轉換!可在此存儲過程中,沒發現它的用處
8.你取出來的數據,要放在變數或是游標中,顯示出來,不然你寫出來的存儲過程有什麼用呢?所以 select ...into ...
9.我也是剛學oracle的,希望可以互相學習一下,呵呵!上面的如有錯誤希望可以告訴我一下啊

『伍』 oracle存儲過程怎麼寫循環

寫循環的操作方法和步驟如下:

1、第一步,編寫存儲過程的整體結構,然後定義變數,見下圖。

『陸』 Oracle 中定義變數的區別

很明顯的一個問題
v_forgid
number,
v_detailcode
varchar2
是存儲過程的兩個輸入參數,調用該存儲過程時賦值的兩個參數變數
而as後面
v_fid
number;
v_detailval
number;
是存儲過程自定的兩個參數,作用v_fid
是接受輸入參數的值,如v_fid
:=
v_forgid;。
便於變數賦值
where
a.forgid
=
v_fid
v_detailval
是將從表中查出的
a.detailval欄位賦值給v_detailval,暫時存儲如:
into
v_detailval
當然也可以不定義as後面兩個自定義變數v_fid
也可以不定義,直接寫where
a.forgid
=
v_forgid
這下你應該明白了吧,有空好好看看存儲過程就知道咯!
希望能幫到你!

『柒』 請問一下Oracle存儲過程中聲明變數一定要declare嗎

不需要加declare的,直接在"IS(或AS)"後面緊跟著定義這個存儲過程的局部變數即可.

『捌』 怎樣在oracle存儲過程中定義數組

首先你需要定義一個數組類型,然後定義這個數組變數
declare
type a_type is table of number;
-- type a_type is array(10) of number;
-- 下面一種定義方式則指定了該數組的最大元素個數

a a_type := a_type(); -- 定義並初始化一個數組變數
begin
a.extend(3); -- 數組擴展到3個元素
a(1) := 1;
a(2) := 10;
a(3) := 100;
end;

另外數組還有一下方法和屬性
first -- 第一個元素下標
last -- 最後一個元素下標
count -- 數組元素個數
prior(n) -- 下標 n 的前一個元素下標
next(n) -- 下標 n 後一個元素下標
extend(n) -- 添加 n 個數組元素,不帶參數添加一個數組元素
delete(n) -- 刪除數組中下標為 n 的元素,不帶參數刪除整個數組元素

『玖』 Oracle 存儲過程的動態變數如何使用

實現思路:
第一步:先定義一個字元串,這個字元串SQL是由動態變數和其他的sql語句成分拼接組成。
第二步:直接執行 execute immediate SQL;
備註:以上方法是oracle提供的動態執行方法語句,直接使用就可以。

VAR_DYNAMIC_SQL := 'INSERT INTO RP_COMFIRMED_EVENT_DETAIL( EVENT_ID,--ID TRANS_TIME,--交易時間 TRANS_TYPE,--交易類型 TRANS_PROVINCE,--開戶省份 CCE_CSTNO,--客戶號 CCE_CERTTYPE,--證件類型 CCE_CERTNO,--證件號 CCE_AMT,--交易金額 CCE_RISK_SCORE,--不處理的風險分值 CCE_PAYEE_ACC,--付款人賬號 CCE_PAYEE_NAME,--付款人姓名 CCE_REC_NODE,--收款人開戶行 CCE_REC_ACC,--收款人賬號 CCE_REC_NAME,--收款人姓名 RULE_NAME,--規則名稱 CCE_RULE_NOTE,--規則描述 SCORE_RANGE--處理後的風險分值 )select EVENT_ID, SYS_CREATION_DATE, GET_NAME_BY_CODE(GET_TOTAL_EVENT_TYPE(T1.EVENT_TYPE,T1.USER_DEFINED_EVENT_TYPE),''eventType'') AS TRANS_TYPE, -- get_province(IP_COUNTRY,IP_CITY) AS CCE_TRANSTYPE, get_vale_from_cd_p('||get_vale_from_cd1('13','5')||'),--開戶省份為自定義欄位 USER_ID, '||get_vale_from_cd1('4','4')||',--證件類型為自定義欄位 '||get_vale_from_cd1('7','4')||',--證件號為自定義欄位 要轉換成動態SQL GET_AMT_BY_CURRENCY(AMOUNT_ORIGINAL,AMOUNT_CURRENCY),--通過匯率和幣種轉換 RISK_SCORE, USER_ACCT_NUMBER, '||get_vale_from_cd_g1(get_vale_from_cd_al)||',--付款人姓名 '||get_vale_from_cd1('11','5')||',--收款人開戶行 自定義欄位 需轉換成動態SQL EXT_ACCT_NUMBER, EXT_ACCT_OWNER_NAME, NVL(POLICY_RULE_ID,''FALLBACK_RULE'') AS RULE_NAME, SUBSTR(GET_RULE_ORDER_ID(ORG_ID,POLICY_RULE_ID),INSTR(GET_RULE_ORDER_ID(ORG_ID,POLICY_RULE_ID),''-'')+1),--描述 GET_SCORE_RANGE(RISK_SCORE) AS RISK_SCORE_RANGE FROM EVENT_LOG_REALTIME T1))'; execute immediate VAR_DYNAMIC_SQL;

『拾』 oracle 存儲過程中select * from 變數 這么寫這個怎麼定義

用動態SQL。

CREATEORREPLACEPROCEDURETEST(I_TABLEINVARCHAR2)
IS
BEGIN
DECLARE
STRSQLVARCHAR2(4000);
P_VALUEVARCHAR2(4000);
BEGIN
STRSQL:='SELECTCOLFROM'||I_TABLE;--COL為欄位名,保證能且只返回一行
_VALUE;
EXCEPTION
WHENOTHERSTHEN
--這里是異常處理
P_VALUE:='';
END;
END;
/

不明白可以追問。

熱點內容
什麼id密碼可以下載安卓 發布:2025-09-24 13:36:54 瀏覽:622
win7如何登陸ftp 發布:2025-09-24 13:01:29 瀏覽:172
海信電視怎麼查看配置 發布:2025-09-24 13:00:31 瀏覽:783
android開發從零開始 發布:2025-09-24 12:51:28 瀏覽:113
為什麼安卓不支持群折疊 發布:2025-09-24 12:03:53 瀏覽:227
開放上網如何設密碼 發布:2025-09-24 11:31:08 瀏覽:566
編譯原理語義分析實驗報告 發布:2025-09-24 11:24:18 瀏覽:759
手機電腦文件夾同步 發布:2025-09-24 11:17:13 瀏覽:403
華為怎麼關閉安卓系統 發布:2025-09-24 10:56:48 瀏覽:1013
其他配置是什麼意思 發布:2025-09-24 10:52:52 瀏覽:55