oracleef存储过程
㈠ EF 通过什么方式 执行oracle的存储过程
方法一:
exec procere_name;
execute procere_name;
方法二:裂氏局
call procere_name;
方肆让法三:核银
begin
execute procere_name;end;
end;
㈡ oracle中的存储过程,有什么作用,以及怎么在代码中使用
定义:存储过程(Stored Procere )是一组为了完成特定功能的sql 语句
集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数
(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要
对象,任何一个设计良好的数据库应用程序都应该用到存储过程。
存储过程是由流控制和SQL 语句书写的过程,这个过程经编译和优化后
存储在数据库服务器中,应用程序使用时只要调用即可。在ORACLE 中,
若干个有联系的过程可以组合在一起构成程序包。
优点:存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时(如对多个表进行Update、Insert、Query、Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.存储过程可以重复使用,可减少数据库开发人员的工作量。
4.安全性高,可设定只有某用户才具有对指定存储过程的使用权。
proc = connection.prepareCall("{ call SIM_MEDICARE.P_Isinblacklist(?,?,?,?,?) }");
proc.setString(1, “”);设置传入参数
proc.registerOutParameter(4, Types.VARCHAR);注册传出参数
proc.execute();执行过程
proc.getString(4)获取结果
㈢ oracle函数和存储过程有什么区别
一、主体不同
1、函数:当需要分析数据清单中的数值是否符合特定条件时,使用数据库工作表函数。
2、存储过程:是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,一次编译后永久有效。
二、特点不同
1、函数:只能返回一个变量,可以嵌入sql中和存储过程中使用。
2、存储过程:用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升。
三、功能不同
1、函数:不能用临时表,只能用表变量,函数不能执行一组修改全局数据库状态的操作。可以作为查询语句的一个部分来调用,由于函数可以返回一个表对象,所以在查询中位于from关键字后面。
2、存储过程:存储过程需要让sql的query可以执行,存储过程可以返回参数,如记录集。sql语句中不可以含有存储过程。
㈣ Oracle 的存储过程怎么写。
oracle 存储过程的基本语法
1.基本结构
CREATE OR REPLACE PROCEDURE 存储过程名字
(
参数1 IN NUMBER,
参数2 IN NUMBER
) IS
变量1 INTEGER :=0;
变量2 DATE;
BEGIN
END 存储过程名字
2.SELECT INTO STATEMENT
将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条
记录,否则抛出异常(如果没有记录抛出NO_DATA_FOUND)
例子:
BEGIN
SELECT col1,col2 into 变量1,变量2 FROM typestruct where xxx;
EXCEPTION
WHEN NO_DATA_FOUND THEN
xxxx;
END;
...
3.IF 判断
IF V_TEST=1 THEN
BEGIN
do something
END;
END IF;
4.while 循环
WHILE V_TEST=1 LOOP
BEGIN
XXXX
END;
END LOOP;
5.变量赋值
V_TEST := 123;
6.用for in 使用cursor
...
IS
CURSOR cur IS SELECT * FROM xxx;
BEGIN
FOR cur_result in cur LOOP
BEGIN
V_SUM :=cur_result.列名1+cur_result.列名2
END;
END LOOP;
END;
7.带参数的cursor
CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID;
OPEN C_USER(变量值);
LOOP
FETCH C_USER INTO V_NAME;
EXIT FETCH C_USER%NOTFOUND;
do something
END LOOP;
CLOSE C_USER;
8.用pl/sql developer debug
连接数据库后建立一个Test WINDOW
在窗口输入调用SP的代码,F9开始debug,CTRL+N单步调试
㈤ 链夊叧Oracle瀛桦偍杩囩▼镄勭浉鍏抽梾棰
銆銆璇︾粏璁茶В链夊叧Oracle瀛桦偍杩囩▼镄勭浉鍏抽梾棰
銆銆 鍦∣racle鏁版嵁搴扑腑 鏁版嵁琛ㄥ埆钖嶆槸涓嶈兘锷烬s镄 渚嫔
銆銆select a appname from appinfo a 钬斺 姝g‘
銆銆select a appname from appinfo as a 钬斺 阌栾
銆銆娉ㄩ喷 杩椤彲鑳芥槸涓轰简阒叉㈠拰Oracle鏁版嵁搴扑腑镄勫瓨鍌ㄨ繃绋嬩腑镄勫叧阌瀛梐s鍐茬獊镄勯梾棰
銆銆 鍦ㄥ瓨鍌ㄨ繃绋嬩腑 select镆愪竴瀛楁垫椂 钖庨溃蹇呴’绱ц窡into 锅囧俿elect鏁翠釜璁板綍 鍒╃敤娓告爣镄勮瘽灏卞彟褰揿埆璁轰简
銆銆
銆銆select af keynode into kn from APPFOUNDATION af where af appid=aid and af foundationid=fid; 链塱nto 姝g‘缂栬疟 select af keynode from APPFOUNDATION af where af appid=aid and af foundationid=fid; 娌℃湁into 缂栬疟鎶ラ敊 鎻愮ず Compilation Error: PLS : an INTO clause is expected in this SELECT statement
銆銆 鍦ㄦ垜浠鍒╃敤select钬︹into钬︹﹁娉曟椂 蹇呴’鍏堢‘淇濇暟鎹搴扑腑链夎ユ浔璁板綍 钖﹀垯浼氭姤鍑 no data found 寮傚父
銆銆鍙浠ュ湪璇ヨ娉曚箣鍓 鍏埚埄鐢╯elect count锛*锛 from 镆ョ湅鏁版嵁搴扑腑鏄钖﹀瓨鍦ㄨヨ板綍 濡傛灉瀛桦湪 鍐嶅埄鐢╯elect钬︹into钬︹
銆銆 璇锋敞镒 鍦ㄥ瓨鍌ㄨ繃绋嬩腑 鍒钖崭笉鑳藉拰瀛楁靛悕绉扮浉钖 钖﹀垯铏界劧缂栬疟鍙浠ラ氲繃 浣嗗湪杩愯岀殑阒舵典细鎶ラ敊
銆銆
銆銆select keynode into kn from APPFOUNDATION where appid=aid and foundationid=fid; 姝g‘杩愯 select af keynode into kn from APPFOUNDATION af where af appid=appid and af foundationid=foundationid; 杩愯岄桩娈垫姤阌 鎻愮ず ORA :exact fetch returns more than requested number of rows
銆銆 鍦ㄥ瓨鍌ㄨ繃绋嬩腑 鍏充簬鍑虹幇null镄勯梾棰
銆銆锅囧傛湁涓涓琛╔ 瀹氢箟濡备笅
銆銆 create table X(id varchar ( ) primary key not null vcount number( ) not null bid varchar ( ) not null 澶栭敭 );
銆銆锅囧傚湪瀛桦偍杩囩▼涓 浣跨敤濡备笅璇鍙
銆銆select sum锛坴count锛 into fcount from X where bid= xxxxxx 濡傛灉X琛ㄤ腑涓嶅瓨鍦╞id= xxxxxx 镄勮板綍 鍒柽count=null锛埚嵆浣縡count瀹氢箟镞惰剧疆浜嗛粯璁ゅ 渚嫔 fcount number锛 锛 = 渚濈劧镞犳晥 fcount杩樻槸浼氩彉鎴恘ull锛 杩欐牱浠ュ悗浣跨敤fcount镞跺氨鍙鑳戒细鍑虹幇闂棰 镓浠ュ湪杩欓噷鎴戜滑链濂藉厛鍒ゆ柇涓涓
銆銆
銆銆if fcount is null then fcount:= ; end if;
銆銆 Hibernate璋幂敤Oracle镄勫瓨鍌ㄨ繃绋
銆銆
銆銆this pnumberManager getHibernateTemplate() execute( new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException SQLException { CallableStatement cs = nnection() prepareCall( {call modifyapppnumber_remain(?)} ); cs setString( foundationid); cs execute(); return null; } });
lishixin/Article/program/Oracle/201311/17685
㈥ oracle中函数和存储过程的区别和联系
在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点。刚学完函数和存储过程,下面来和大家分享一下自己总结的关于函数和存储过程的区别。
一、存储过程
1.定义
存储过程是存储在数据库中提供所有用户程序调用的子程序,定义存储过程的关键字为procere。
2.创建存储过程
create [or replace] procere 存储过程名
[(参数1 类型,参数2 out 类型……)]
as
变量名类型;
begin
程序代码体
end;
示例一:无参无返
create or replace procere p1
--or replace代表创建该存储过程时,若存储名存在,则替换原存储过程,重新创建
--无参数列表时,不需要写()
as
begin
dbms_output.put_line('hello world');
end;
--执行存储过程方式1
set serveroutput on;
begin
p1();
end;
--执行存储过程方式2
set serveroutput on;
execute p1();
示例二:有参有返
create or replace procere p2
(name in varchar2,age int,msg out varchar2)
--参数列表中,声明变量类型时切记不能写大小,只写类型名即可,例如参数列表中的name变量的声明
--参数列表中,输入参数用in表示,输出参数用out表示,不写时默认为输入参数。
------------输入参数不能携带值出去,输出参数不能携带值进来,当既想携带值进来,又想携带值出去,可以用in out
as
begin
msg:='姓名'||name||',年龄'||age;
--赋值时除了可以使用:=,还可以用into来实现
--上面子句等价于select '姓名'||name||',年龄'||age into msg from al;
end;
--执行存储过程
set serveroutput on;
declare
msg varchar2(100);
begin
p2('张三',23,msg);
dbms_output.put_line(msg);
end;
示例三:参数列表中有in out参数
create or replace procere p3
(msg in out varchar2)
--当既想携带值进来,又想携带值出去,可以用in out
as
begin
dbms_output.put_line(msg); --输出的为携带进来的值
msg:='我是从存储过程中携带出来的值';
end;
--执行存储过程
set serveroutput on;
declare
msg varchar2(100):='我是从携带进去的值';
begin
p3(msg);
dbms_output.put_line(msg);
end;
示例四:存储过程中定义参数
create or replace procere p4
as
--存储过程中定义的参数列表
name varchar(50);
begin
name := 'hello world';
dbms_output.put_line(name);
end;
---执行存储过程
set serveroutput on;
execute p4();
总结:1.创建存储过程的关键字为procere。
2.传参列表中的参数可以用in,out,in out修饰,参数类型一定不能写大小。列表中可以有多个输入输出参数。
3.存储过程中定义的参数列表不需要用declare声明,声明参数类型时需要写大小的一定要带上大小。
4.as可以用is替换。
5.调用带输出参数的过程必须要声明变量来接收输出参数值。
6.执行存储过程有两种方式,一种是使用execute,另一种是用begin和end包住。
存储过程虽然有很多优点,但是它却不能使用return返回值。当需要使用return返回值时,我们可以使用函数。
二、存储函数
1.函数与存储过程的结构类似,但是函数必须有一个return子句,用于返回函数值。
create or replace function f1
return varchar--必须有返回值,且声明返回值类型时不需要加大小
as
msg varchar(50);
begin
msg := 'hello world';
return msg;
end;
--执行函数方式1
select f1() from al;
--执行函数方式2
set serveroutput on;
begin
dbms_output.put_line(f1());
end;
三、存储过程与存储函数的区别和联系
相同点:1.创建语法结构相似,都可以携带多个传入参数和传出参数。
2.都是一次编译,多次执行。
不同点:1.存储过程定义关键字用procere,函数定义用function。
2.存储过程中不能用return返回值,但函数中可以,而且函数中必须有return子句。
3.执行方式略有不同,存储过程的执行方式有两种(1.使用execute2.使用begin和end),函数除了存储过程的两种方式外,还可以当做表达式使用,例如放在select中(select f1() form al;)。
总结:如果只有一个返回值,用存储函数,否则,一般用存储过程。
㈦ oracle中的存储过程怎么写
Oracle存储过程写法实例
总结项目中写的存储过程例子:
Oracle存储过程基本语法 存储过程
1 CREATE OR REPLACE PROCEDURE 存储过程名
2 IS/AS
3 BEGIN
4 NULL;
5 EXCEIPTION;
6 END;
1、创建存储过程,后面可用is或者as:
create or replace procere PRO_COMPLAIN_TEMPLATE as
2、定义变量,此处用到了%TYPE和%ROWTYPE,参考 /database/201211/168564.html ,另外定义了一个游标,TEM_INSTANCE TEMPLATE_CUR%ROWTYPE这个类型定义必须要在游标定义之后:
NEED_DO_FOR_ZL INTEGER;
CURRENT_MAX_ID MEMO_TEMPLET.TEMPLET_ID%TYPE;
CURSOR TEMPLATE_CUR IS SELECT TEMPLET_NAME, TEMPLET_CONTENT FROM SYS_COMPLAINT_TEMPLET;
TEM_INSTANCE TEMPLATE_CUR%ROWTYPE;
3、begin开始块:
begin
4、该插入语句使用了DBLINK,还有使用DBMS_OUTPUT.put_line('打印信息')进行信息输出:
insert into MEMO_TEMPLET (TEMPLET_ID, TEMPLET_CONTENT, TEMPLET_TYPE, TEMPLET_MEMO) (SELECT * FROM MEMO_TEMPLET@COMPANY);
SELECT COUNT(*) INTO NEED_DO_FOR_ZL FROM SYS_COMPLAINT_TEMPLET;
IF(NEED_DO_FOR_ZL > 0) THEN
DBMS_OUTPUT.put_line('打印信息');
SELECT MAX(TEMPLET_ID)+1 INTO CURRENT_MAX_ID FROM MEMO_TEMPLET;
DBMS_OUTPUT.put_line('MEMO_TEMPLET最大ID' || CURRENT_MAX_ID);
FOR TEM_INSTANCE IN TEMPLATE_CUR LOOP
INSERT INTO MEMO_TEMPLET (TEMPLET_ID, TEMPLET_CONTENT,
TEMPLET_TYPE, TEMPLET_MEMO) VALUES (CURRENT_MAX_ID,
TEM_INSTANCE.TEMPLET_CONTENT, '7', NULL);
CURRENT_MAX_ID := CURRENT_MAX_ID + 1;
DBMS_OUTPUT.put_line(TEM_INSTANCE.TEMPLET_CONTENT);
END LOOP;
END IF;
COMMIT;
www.2cto.com
4、exception块,使用WHEN OTHERS THEN,其中用raise可显示错误信息:
exception
WHEN OTHERS THEN
DBMS_OUTPUT.put_line('sqlcode : ' ||sqlcode);
raise;
ROLLBACK;
IF TEMPLATE_CUR%ISOPEN THEN
CLOSE TEMPLATE_CUR;
END IF;
DBMS_OUTPUT.put_line('打印信息');
end;
注:关于游标的使用,如果像本例中使用for循环去遍历游标的话则不需要显式的去用open/close
cursor打开和关闭游标,此处会自己处理,如果使用fetch
into的话就需要显式开关游标,另外任意执行一个update操作,用隐式游标sql的属性%found,%notfound,%rowcount,%isopen观察update语句的执行情况,也可以使用来判断游标状态,如IF
TEMPLATE_CUR%ISOPEN THEN。
㈧ Oracle数据库的存储过程怎么写
1 CREATE OR REPLACE PROCEDURE 存储过程名
2 IS
3 BEGIN
4 NULL;
5 END;
行1:
CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它;
行2:
IS关键词表明后面将跟随一个PL/SQL体。
行3:
BEGIN关键词表明PL/SQL体的开始。
行4:
NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句;
行5:
END关键词表明PL/SQL体的结束.
存储过程创建语法:
create or replace procere 存储过程名(param1 in type,param2 out type)
as
变量1 类型(值范围); --vs_msgVARCHAR2(4000);
变量2 类型(值范围);
Begin
Select count(*) into 变量1 from 表A where列名=param1;
If (判断条件) then
Select 列名 into 变量2 from 表A where列名=param1;
Dbms_output。Put_line(‘打印信息’);
Elsif (判断条件) then
Dbms_output。Put_line(‘打印信息’);
Else
Raise 异常名(NO_DATA_FOUND);
End if;
Exception
When others then
Rollback;
End;