1. 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的,希望可以互相學習一下,呵呵!上面的如有錯誤希望可以告訴我一下啊
2. 求教oracle存儲過程的賦值和更新
--本存儲過程為簡化版,格式、變數的定義等許多情況需要自行添加
--本存儲過程假設phone與name一一對應,即不會出現一個phone對應多個name的情況
--如果實際情況不為一一對應,請在自行完善存儲過程
--①首先查出表1中phone不為空並且name 為空的記錄,並建立游標
cursor cur_row is
select phone from table1 where table1.name is null and phone is not null;
--②遍歷游標cur_row的phone欄位,去表2中查詢出name並更新到表1中
for v_num in cur_row loop
--下面的v_name應該先聲明,這里直接用了,類似情況不再做說明
--下面的select into 未做異常處理,請自行完善,類似情況不再做說明
select name into v_name from table2 where table2.phone=v_num.phone;
update table1 set table1.name = v_name where table1.phone = v_num.phone;
end loop;
--統一提交
commit;
--完成
--純手打,可能有錯別字,請自行修正
3. 求一條簡單的oracle查詢存儲過程
**********
補充:已經解釋過了,原因是你的【'p_user_login_name'】兩遍有引號,你把引號去掉就可以了,如果不去的話資料庫實際執行的sql是:
【select user_telephone into aa from user_infomation where user_telephone='p_user_login_name'】而不是【select user_telephone into aa from user_infomation where user_telephone='小豬'】
**********
1、首先你的查詢存儲過程是有問題的
【user_telephone:='p_user_login_name'】改成
【user_telephone=p_user_login_name】,【aa varchar2】後面加一個【;】。
再加一個列印語句即可:
dbms_output.put_line(aa);[注意想看到列印結果必須 set serveroutput on]
原因:
【:=】是賦值符號。
【p_user_login_name】是存儲過程傳入的變數,加上引號就變成字元串了,裡面的值就得不到了。
2、如果你查詢的結果只有一條記錄的話,按照上面改正之後就沒有問題了,如果是多條記錄就要用到游標,因為你的where條件是動態傳入的,要使用游標變數。
var p_cursor refcursor;
create or replace procerce select_user_information
(
p_user_login_name in varchar2
)
as
begin
open :p_cursor for
'select user_telephone from user_infomation where user_telephone='||p_user_login_name;
end;
/
print p_cursor;
說明:因為上面那個游標變數是在存儲過程外面定義的,所以在存儲過程內部引用的時候要使用[:]。
**************
再補充一個直接在存儲過程內部定義的列子:
create or replace procerce select_user_information
(
p_user_login_name in varchar2
)
as
aa varchar2;
type refcur is ref cursor;
p_cursor refcur;
begin
open p_cursor for
'select user_telephone from user_infomation where user_telephone='||p_user_login_name;
loop
fetch p_cursor into aa;
exit when p_cursor%NOTFOUND;
dbms_output.put_line(aa);
end loop;
end;
/
---
以上,希望對你有所幫助。
4. oracle 存儲過程中查詢序列值並用變數接收
select seq_test.nextval into v_sv from al;
查詢序列當前值、查詢序列下一個值,都不能直接寫序列.nextval,而是寫成SQL表達式的形式方可執行
5. 大家幫忙看看Oracle存儲過程怎樣給變數賦值
在pl/sql developer中,選中你要執行的存儲過程,點擊右鍵選擇「測試」,在下面的參數中輸入你的「123456789」,點擊工具欄的「執行」,執行完畢後,如果有返回值就點擊cursor,可以看到結果了。
6. oracle存儲過程中怎麼輸出變數的值
--代碼示例與講解(SQLServer下代碼也是類似)
DECLARE@LSINT--定義一個變數@LS
SET@LS=8--讓@LS等於8
SELECT@LSAStLS--選擇變數@LS作為tLS(即輸出)列出
7. oracle中如何查看存儲過程的定義
使用tode或者navicat
或者navigtor等連接oracle的工具
找到procere的選項即可查看所有的存儲過程,點擊某個名字可以看到其中的定義
8. 請教oracle存儲過程基本問題,簡單查詢問題,我是初學者...
創建一個存儲過程的基本語句如下:
CREATE [OR REPLACE] PROCEDURE 存儲過程名[(參數[IN|OUT|IN OUT] 數據類型...)]
{AS|IS}
[說明部分]
BEGIN
可執行部分
[EXCEPTION
錯誤處理部分]
END [過程名];
其中:
可選關鍵字OR REPLACE 表示如果存儲過程已經存在,則用新的存儲過程覆蓋,通常用於存儲過程的重建。
參數部分用於定義多個參數(如果沒有參數,就可以省略)。參數有三種形式:IN、OUT和IN OUT。如果沒有指明參數的形式,則默認為IN。
關鍵字AS也可以寫成IS,後跟過程的說明部分,可以在此定義過程的局部變數。
編寫存儲過程可以使用任何文本編輯器或直接在SQL*Plus環境下進行,編寫好的存儲過程必須要在SQL*Plus環境下進行編譯,生成編譯代碼,原代碼和編譯代碼在編譯過程中都會被存入資料庫。編譯成功的存儲過程就可以在Oracle環境下進行調用了。
刪除存儲過程的語法如下:
DROP PROCEDURE 存儲過程名;
如果要重新編譯一個存儲過程,則只能是過程的創建者或者擁有ALTER ANY PROCEDURE系統許可權的人。語法如下:
ALTER PROCEDURE 存儲過程名 COMPILE;
執行的方法如下:
方法1:
EXECUTE 模式名.存儲過程名[(參數...)];
方法2:
BEGIN
模式名.存儲過程名[(參數...)];
END;
傳遞的參數必須與定義的參數類型、個數和順序一致(如果參數定義了默認值,則調用時可以省略參數)。參數可以是變數、常量或表達式。
如果是調用本賬戶下的存儲過程,則模式名可以省略。要調用其他賬戶編寫的存儲過程,則模式名必須要添加。
以下是一個生成和調用簡單存儲過程的訓練。注意要事先授予創建存儲過程的許可權。
存儲過程樣例:
CREATE OR REPLACE PROCEDURE EMP_COUNT
AS
V_TOTAL NUMBER(10);
BEGIN
SELECT COUNT(*) INTO V_TOTAL FROM EMP;
DBMS_OUTPUT.PUT_LINE('雇員總人數為:'||V_TOTAL);
END;
9. 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;
10. 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; --結束存儲過程。