java主程序怎样调用子程序_存过和函数以及在Java程序中的调用
存儲過程,函數都是數據庫的對象。
創建和調用
存儲在數據庫中的子程序,是由plsql語言寫的,完成特定功能的程序。
函數可以返回值,存過不能返回值。除此之外,一致。
create procedure 過程名(參賽列表)
as
plsql子程序
打印一helloWorld
create or replace procedure sayhelloworld
as
--說明部分
begin
dbms.output_line("hello world");
end;
調用存儲過程的方式一:
execute/exec sayhelloworld
二:
begin
sayhelloworld();
sayhelloworld();
set serveroutput on;
create or replace procedure 過程名(參數列表)
as
begin
end;
/
創建帶參數的存儲過程
為指定的員工,漲100元薪水,并打印漲前和漲后的薪水?
create or replace procedure raisesaly(eno in number)
as
--定義一個變量,保存漲前的薪水
psal emp.sal%type;
begin
--得到員工漲前的薪水
select sal into psal from emp where empno = eno;
--
update emp set sal = sal+100 where empno = eno;
dbms_output_line("漲前":||psal||"漲后"||psal+100));
一般不在存過中,函數中,提交回滾,不能保證提交,會在同一個事務中。
如何來漲工資:
raisesal(7899);
raisesal(9999);
commit;
end;
/
輸入參數in 輸出參數out
不推薦遠程調試
推薦本地調試(可以在生產機上虛擬機)
數據庫所在的服務器在同一個機器上
調試存過:
可進行調試么?
編譯以進行調試--圖標變化。
sum(a=>1,b=>2)賦值方式
打斷點,程序停在斷點的位置上(權限問題,具備調試的權限)
管理員授權
sqlplus /as sysdba;
grant ... to...
f8單步運行
存儲函數
可帶參數,并返回一個計算值,也是一個命名的存儲程序
結構類似,必須有一個return 值
create or replace function 函數名(參數列表)
return 返回類型
as
begin
end;
/
--查某個員工的年收入
create or replace function queryempincome(eno in number)
return number
as
--定義變量保存員工的薪水和獎金
psal emp.sal%type;
pcomm emp.comm%type;
begin
select sal,comm into psal,pcomm from emp where empno = eno;
return psal*12+pcomm;
end;
/
return 函數
可以遠程調用set linesize 1000;
null值的情況下,相加為null,
nvl(pcomm,0);
out參數:
存過沒有返回值。
過程和函數都可以通過out指定一個,多個out參數,可以out參數實現返回值。
查下某個員工的姓名 月薪和職位
create or replace procedure queryempinfom(emo in number,pename out varchar2,psal out number,pjob out varchar2)
as
begin
得到該員工的姓名,月薪和職位
select ename,sal,empjob into pename,pasl,pjob from emp where empno = eno;
end;
/
out中返回一個集合?
out參數太多?
集合當中只有一行。
app中訪問和調用存過和存函
Java中訪問和調用數據庫中的子程序
Connection
Statement:sql語句運行的環境
CallableStatement:子接口
myslq和oracle的調用標準是一致的
調用存過:
{call [(,,...)]}
{call queryempinfom(?,?,?,?)}
conn.prpareCall(sql);
對于輸入參數需要賦值?
對于輸出參數在調用之前是沒有值的,需要聲明;
call.registerOutParameter(2,sqlType);--OracleTypes.VARCHAR);把數據庫的類型轉為Java類型。
...
執行調用
call.execute();--out參數就有返回值了
取出結果
call.getString(2);
call.getDouble(3);
call.getString(4);
打印看一看
訪問存函:
{?=call [(arg1),,...)]}
{?=call queryempincome(?)}
call = conn.prepreCall(sql);
對中輸出參數,聲明
call.registerParameter(1,OracleTypes.NUMBER);
對于輸入參數,賦值
call.setInt(2,8888);
call.execute();
執行以后,就取出結果集。
out參數中使用光標
聲明包結果
包頭
包體
某個部門中,所有員工的所有信息
create or replace package mypackage as
type empcursor is fef cursor;
procedure queryEmpList(dno in number,empList out empcursor);
end mypackage;
包體需要實現包頭所有聲明的所有方法
包體:
create or replace package body mypackage as
procedure queryEmpList(dno in number, empList out empcursor) as
begin
open empList for select * from emp where deptno = dno;
end queryEmpList;
end mypackage;
光標在使用前要打開。
Java程序中調用包
{call [,,....]}
{call mypackage.queryEmplist(?,?)}
call = conn.prepareCall(sql);
對于輸入參數,需賦值
對于輸出參數,需聲明
call.registerOutParameter(2,OracleTypes.CURSOR);
call.execute();
取出該部門中的所有員工的信息:
rs = ((OracleCallableStatement)call).getCursor(2);
while(rs.next()){
}
總結
以上是生活随笔為你收集整理的java主程序怎样调用子程序_存过和函数以及在Java程序中的调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java mock什么意思_java @
- 下一篇: java掉单_【Java】抄答案就是了,