大家好,又见面了,我是你们的朋友全栈君。
navicat 存储过程界面功能
点击运行时,会弹出窗口填入输入参数。
使用Navicat创建存储过程
在函数位置,右键新建函数,
OUT参数没有默认值,写了也没用。
软件自动生成存储过程框架,然后人去补充“声明变量”和“主体”部分,
注意存储过程名称可以用引号,也可以不用引号。
Navicat 运行存储过程
方法一:使用 Navicat 软件界面功能
方法二:在查询界面创建变量并调用存储过程
Oracle存储过程内部定义变量:“变量名 数据类型(大小)”,举例:temp NUMBER(12);
Oracle存储过程外部定义变量(在查询界面):
declare
变量名1 数据类型1(大小);
变量名2 数据类型2(大小);
注意定义变量的方法和调用存储过程的方法:
declare
idnum VARCHAR2(100) ; –输入参数
out_gender clob; –输出参数,BLOB和CLOB都是大字段类型,BLOB按二进制来存储的,CLOB直接存储文字
BEGIN
DBMS_OUTPUT.ENABLE(buffer_size => null) ; –设置缓存大小不受限制
idnum := ‘1’; –赋值
–调用存储过程,TEST_SELECT3 为存储过程的名字
TEST_SELECT3(idnum,out_gender);
dbms_output.put_line(out_gender); –输出结果
end;
分享:CLOB与BLOB的区别及用途:https://blog.csdn.net/qq_36544760/article/details/82665199
错误
[Err] ORA-20000: ORU-10027: buffer overflow, limit of 20000 bytes
缓存溢出。 使用dbms_output.put_line(变量)时报出的错误,从上面也可以知道dbms_output.put_line默认的缓存大小20000bytes 。
解决方法:在调用Oracle输出语句之前,先调用 DBMS_OUTPUT.ENABLE(buffer_size => null),表示输出buffer不受限制。
分享几个存储过程示例
如下存储过程包含了声明变量、变量赋值、入参、出参、CASE WHEN语句、游标等基础用法。
示例一
注意 Oracle 中,in out 要分开写,
Oracle 存储过程变量声明格式: 变量名 数据类型(长度); (数据类型一定要加长度)
赋值语句格式:变量 :=值,将值赋值给变量。
CREATE OR REPLACE
PROCEDURE TEST_EXCHANGE(a in out int,b in out int)
as
temp NUMBER(12);
begin
temp := a;
a := b;
b := temp;
end ;
示例二
表结构及数据
注意
表中SNO是NUMBER数据类型,但是存储过程传参是VARCHAR2,依然可以进行比较运算;
DEFAULT设置默认值;
rowData TEST_STUDENT%rowtype; 将表TEST_STUDENT一行数据的格式定义变量;
select * into 变量,是把查询出来的值赋值给变量,
注意case when 写法。
CREATE OR REPLACE
PROCEDURE “TEST_CASE” (idnum IN VARCHAR2 DEFAULT ‘1’, gender OUT VARCHAR2)
AS
rowData TEST_STUDENT%rowtype;
BEGIN
select * into rowData from TEST_STUDENT where SNO=idnum;
case rowData.GENDER
when 1 then
dbms_output.put_line(‘女人’);
gender :=’女人’;
when 2 then
dbms_output.put_line(‘男人’);
gender :=’男人’;
else
dbms_output.put_line(‘人妖’);
gender :=’人妖’;
end case;
END;
输出结果展示:
第一行 是 “dbms_output.put_line(‘女人’);”打印语句打印出来的,
第二行是输出参数。
示例三
CREATE OR REPLACE
PROCEDURE TEST_SELECT(
IN_SNO in NUMBER,
OUT_SNAME out varchar2,
OUT_SAGE out NUMBER
) AS
BEGIN
SELECT SNAME,SAGE
into OUT_SNAME,OUT_SAGE
FROM TEST_STUDENT WHERE SNO = IN_SNO;
END;
示例四
CREATE OR REPLACE
PROCEDURE TEST_SELECT4(DEPTID in NUMBER)
AS
–游标的定义
Cursor test_cursor is
select department_id, job_id, name, hire_date
from TEST_EMPLOYEES where department_id = DEPTID;
BEGIN
for rowData in test_cursor
loop
exit when test_cursor%notfound;
dbms_output.put_line(‘数据是:’||rowData.job_id);
end loop;
END;
示例五
CREATE OR REPLACE
PROCEDURE TEST_UPDATE
AS
v_rows NUMBER;
BEGIN
–更新数据
UPDATE TEST_EMPLOYEES SET SALARY = 30000
WHERE department_id = 1 AND job_id = ‘AD_VP’;
–获取默认游标的属性值
v_rows := SQL%ROWCOUNT;
DBMS_OUTPUT.PUT_LINE(‘更新了’||v_rows||’个雇员的工资’);
–回退更新,以便使数据库的数据保持原样,如果要提交用commit;
rollback;
END;
附Java调用Oracle存储过程返回结果集—从建表、存储过程到调用的详细过程:
https://blog.csdn.net/qiudechao1/article/details/98876509
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/160893.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...