这计算生命的app叫什么?

路上风景正好,天上太阳正晴。
程序员不应该是含蓄的,欢迎挑刺!
1、创建存储过程
CREATE[OR REPLACE] PROCEDURE [schema.] procedure_name[(argument[{IN|OUT|IN OUT}] datatype[,...])] {IS|AS} pl/sql_
procedure_name为存储过程的名称,
argument是参数名,
datatype是对应参数的数据类型,
pl/sql_body是该存储过程真正进行的处理操作的PL/SQL块,
OR REPLACE是可选项,如果存在一个同名的存储过程,则先删除后创建,
关键字IS|AS是等价的,用来引出过程体。
1)存储过程的参数
创建存储过程
CREATE OR REPLACE PROCEDURE UpdateAuths(
p_AuthsCode auths.author_code%TYPE,
p_AuthsSalary auths.salary%TYPE)
UPDATE auths
SET salary=p_AuthsSalary
WHERE author_code=p_AuthsC
END UpdateA
调用存储过程
v_authorcode auths.author_code%TYPE:='A0001';
v_salary auths.salary%TYPE:=350;
UpdateAuths(v_authorcode,v_salary);
形参和实参
p_AuthsSalary,p_AuthsCode为形式参数
v_authorcode,v_salary为实际参数
关键字代表参数的三种不同模式
IN:当调用存储过程的时候,该模式的形参接收对应实参的值,并且该形参是只读的,即不能被修改。如果在创建存储过程时没有指定参数的模式,则默认为IN。
OUT:在存储过程中,该形参被认为是只能写,即只能为其赋值。在存储过程中不能读它的值。返回时,将该形参值传给相应的实参。
IN OUT:该模式是前两种模式的合并。
2)存储过程的处理部分
一个PL/SQL块,该块包含定义部分、可执行部分以及异常处理部分,其中可执行部分是必须有的。
CREATE OR REPLACE 过程名
--参数定义部分
--局部变量定义部分
--可执行部分
--异常处理部分
END 过程名;
在END后加上存储过程名是可选的,只是为了增加程序的可读性。如果加上,则必须要和前面的存储过程名相同。
1.2存储过程的参数
1)参数的数据类型
在定义一个存储过程参数时,不能指定CHAR类型和VARCHAR2类型形参的长度,也不能指定NUMBER形参的精度和标度。这些约束有实参来传递。
CREATE OR REPLACE PROCEDURE proc_auths(
--参数定义了类型长度,这将产生编译错误。
p_code IN OUT VARCHAR2(6),
P_salary OUT NUMBER(8,2)) AS
应修改为:
CREATE OR REPLACE PROCEDURE proc_auths(
p_code IN OUT VARCHAR2,
P_salary OUT NUMBER) AS
SELECT salary INTO p_salary
FROM auths
WHERE author_code=p_
调用存储过程:
v_code VARCHAR2(6);
v_salary NUMBER(8,2);
v_code:='A0001';
proc_auths(v_code,v_salary);
如果使用%TYPE为参数定义类型,那么该参数将具有定义在形参上而不是通过实参传递的数据长度。
CREATE OR REPLACE PROCEDURE query_salary(
p_code IN OUT auths.author_code%TYPE,
P_salary OUT auths.salary%TYPE) AS
END query_
如上面的存储过程,由于auths表中的author_code字段长度为6,因此p_code的长度也为6。
2)参数的传值方式
位置表示法
实参通过位置与形参进行联系。
名称表示法
实参是与形参的名称进行联系。
定义一个存储过程
CREATE OR REPLACE PROCEDURE insert_auths(
p_code auths.author_code%TYPE,
p_name auths.name%TYPE) AS
INSERT INTO auths(author_code,name) VALUES(p_code,p_name);
END insert_
v_code VARCHAR2(6);
v_name VARCHAR2(12);
v_code:='A0001';
v_name:='张三';
--使用位置表示法调用
insert_auths(v_code,v_name);
--使用命名表示法调用
insert_auths(p_name--&v_name,p_code--&v_code);
两种表示法可以混合使用。但是,当调用存储过程中出现了第一个命名表示法的参数时,后面的参数也必须使用命名表示法传值。
3)参数的缺省值
类似于变量的声明,一个过程或函数的形参可以有缺省值。如果参数有缺省值,那么在调用时就可以不用给它传值,只使用缺省值。如果给它传值,则实参的值代替缺省的值。
参数缺省值声明如下:
parameter [mode] datatype {:=|DEFAULT} initial_value
parameter是形参名称
mode是参数模式
datatype是参数的类型
initial_value用来为形参指定缺省值
使用关键字DEFAULT或":="来指定一个缺省值。
CREATE OR REPLACE PROCEDURE insert_auths(
p_code auths.author_code%TYPE :='A0001',
p_name auths.name%TYPE DEFAULT '张三'
END insert_
2、创建函数
函数和存储过程非常类型,都有三种模式的参数。他们都可以被存储在数据库中,并且在快中调用。
存储过程只能作为一个PL/SQL语句调用,而函数作为表达式的一部分调用。并且它们的定义部分、可执行部分和异常处理部分都是不同的。
2.1 创建函数的语法
CREATE [OR REPLACE] FUNCTION schema.function
[(argument[{IN|OUT|IN OUT}]datatype[,...])]
RETURN return_datatype {IS|AS}
function是函数名
argument是参数名
datatype是参数的类型
return_datatype是函数返回值的类型
PL/SQL_body是函数的处理部分
参数列表时可选的。在没有参数的情况下,函数的定义与调用都没有圆括号。但返回值类型是必需的,因为函数是作为表达式的一部分调用,必须返回一个值。
CREATE OR REPLACE FUNCTION SalaryStat(
p_Sex auths.sex%TYPE)
RETURN BOOLEAN IS
v_MaxAuthors NUMBER;
v_ReturnValue BOOLEAN;
SELECT COUNT(author_code)
INTO v_MaxAuthors
IF v_MaxAuthors& 10 THEN
v_ReturnValue:=TRUE;
v_ReturnValue:=FALSE;
RETURN v_ReturnV
END SalaryS
DECLARE CURSOR c_Auths IS
SELECT distinet sex
FOR v_AuthsRecord IN c_Auths LOOP
IF SalaryStat(v_AuthsRecord.sex) THEN
UPDATE auths
SET salary = salary-50
WHERE sex=v_AuthsRecord.
2.2函数的返回值
在函数内,是通过RETURN语句来返回值的。
expression是准备返回的值。如果expression的类型和函数头中指定的类型不符,expression类型会自动转换。RETURN语句被执行后,控制权立刻返回给调用环境。
在函数体重可以有多条RETURN语句,但还只能有一条被执行。在函数结束的时候,如果没有执行RETURN语句会产生错误。
CREATE OR REPLACE FUNCTION SalaryStat(
p_Sex auths.sex%TYPE)
RETURN VARCHAR2 IS
v_MaxAuthors NUMBER;
SELECT COUNT(author_code)
INTO v_MaxAuthors
IF v_MaxAuthors& 10 THEN
RETURN v_ReturnV
RETURN v_ReturnV
END SalaryS
RETURN也可以用在存储过程中。在这种情况下,它没有参数。当执行了不带参数的RETURN语句后,立刻将控制权返回到调用环境,并将OUT和IN OUT模式的形参的当前值传给实参,然后继续执行调用存储过程后的语句。
函数和存储过程的相同点:
都可以通过OUT模式的参数返回一个活多个值。
代码都有定义部分、可执行部分和异常部分。
都可以使用缺省值。
都可以用位置表示法和命名表示法调用。
一般情况下,如果只有一个返回值,使用函数;如果有多个返回值则使用存储过程。
3、删除过程与函数
DROP PROCEDURE procedure_
DROP FUNCTION function_
4、库存子程序和局部子程序
前面所讲的子程序都是存储在数据库中的子程序,即库存子程序。这些子程序都是有CREATE命令创建的,并可在其它的PL/SQL快中调用。他们在创建时要要进行编译,并将编译后的代码存储在数据库中。当子程序被调用时,编译后的代码从数据库中读出并执行。
一个子程序也可以在块的定义部分创建,这样的子程序被叫作局部子程序。
CURSOR c_AllAuthors IS
SELECT name,sex
v_FormattedName VARCHAR2(60);
/*函数将返回带性别的作家名,性别用括号括起放在名字的后面*/
FUNCTION FormatName(p_Name IN VARCHAR2,p_Sex IN NUMBER) RETURN VARCHAR2 IS
v_Sex VARCHAR2(16);
IF p_Sex=1 THEN
v_Sex:='男';
v_Sex:='女';
RETURN p_Name ||'('||v_Sex||')';
END FormatN
--块的执行部分开始
FOR v_AuthsRecord IN c_AllAuthors LOOP
v_FormattedName:=FormatName(v_AuthsRecord.name,v_AuthsRecord.sex);
DBMS_OUTPUT.PUT_LINE(v_FormattedName);--显示结果
上面的示例,在无名块的定义部分穿件了FormatName函数。这个函数只在创建它的块中可用,它的作用域从创建它开始到块结束,其他的块不能调用它。
局部子程序只能在定义部分的最后被创建,如将FormatName函数移到c_AllAuthors的前面,会出现编译错误。
阅读(...) 评论()温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
给你点阳光你就灿烂,给你点洪水你就泛滥。破锅自有破锅盖,丑鬼自有丑女爱。只要情深意似海,麻子也能放光彩!
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(7589)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'存储过程和函数的区别',
blogAbstract:'
首先如图所示,Oracle中的差别
&用于在数据中完成特定的操作或者任务
&用于特定的数据
&程序头部申明procedure
&程序头部申明function
&程序头部申明时不需要描述返回类型
&程序头部申明时需要描述返回类型,而且PL/SQL至少要包含一个有效的return语句
&可以使用in/out/ in out
&可以使用in/out/in out
&可作为一个独立的PL/SQL语句来执行
&不能立即执行,必须作为表达式的一部分
&可以通过out.int out
&通过return语句返回一个值
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:5,
publishTime:3,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'给你点阳光你就灿烂,给你点洪水你就泛滥。破锅自有破锅盖,丑鬼自有丑女爱。只要情深意似海,麻子也能放光彩!',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}PL-SQL 存储函数和存储过程_数据库_何问起
您的位置: -
PL-SQL 存储函数和存储过程

PL-SQL 存储函数和存储过程
ORACLE 提供能够把PL/SQL 程序存储在数据库中,并能够在不论什么地方来执行它。这样就叫存储过程或函数。
过程和函数统称为PL/SQL子程序。他们是被命名的PL/SQL块,均存储在数据库中,并通过输入、输出參数或输入/输出參数与其调用者交换信息。
过程和函数的唯一差别是函数总向调用者返回数据,而过程则不返回数据。
①创建函数
1. 建立内嵌函数
语法例如以下:
CREATE[OR REPLACE] FUNCTION function_name
&&& [ (argment [ { IN| IN OUT }] Type,
&&& argment [ { IN| OUT| IN OUT} ] Type ]
&&& [ AUTHID DEFINER| CURRENT_USER ]
&&& RETURN return_type
&&& &类型.变量的说明&
&&& FUNCTION_body
&&& 其他语句
1) OR REPLACE 为可选. 有了它, 能够或者创建一个新函数或者替换同样名字的函数, 而不会出现冲突
2) 函数名后面是一个可选的參数列表, 当中包括IN, OUT 或IN OUT 标记. 參数之间用逗号隔开.
&&& IN 參数标记表示传递给函数的值在该函数运行中不改变;
&&& OUT 标记表示一个值在函数中进行计算并通过该參数传递给调用语句;
&&& IN OUT 标记表示传递给函数的值能够变化并传递给调用语句. 若省略标记, 则參数隐含为IN。
3) 由于函数须要返回一个值, 所以RETURN 包括返回结果的数据类型.
2. 内嵌函数的调用
函数声明时所定义的參数称为形式參数,应用程序调用时为函数传递的參数称为实际參数。应用程序在调用函数时。
能够使用下面三种方法向函数传递參数:
第一种參数传递格式称为位置表示法,格式为:
另外一种參数传递格式称为名称表示法,格式为:
argument =& parameter [,…]
当中:argument 为形式參数,它必须与函数定义时所声明的形式參数名称同样。Parameter 为实际參数。
在这样的格式中,形势參数与实际參数成对出现,相互间关系唯一确定,所以參数的顺序能够随意排列。
第三种參数传递格式称为混合表示法:
即在调用一个函数时,同一时候使用位置表示法和名称表示法为函数传递參数。採用这样的參数传递方法时,
使用位置表示法所传递的參数必须放在名称表示法所传递的參数前面。也就是说。不管函数具有多少个參数,
仅仅要当中有一个參数使用名称表示法。其后全部的參数都必须使用名称表示法。
不管採用哪一种參数传递方法,实际參数和形式參数之间的数据传递仅仅有两种方法:传址法和传值法。
所谓传址法是指在调用函数时。将实际參数的地址指针传递给形式參数,使形式參数和实际參数指向内存中的同一区域。从而实现參数数据的传递。
这样的方法又称作參照法,即形式參数參照实际參数数据。输入參数均採用传址法传递数据。
传值法是指将实际參数的数据复制到形式參数,而不是传递实际參数的地址。默认时,输出參数和输入/输出參数均採用传值法。
在函数调用时,ORACLE将实际參数数据复制到输入/输出參数,而当函数正常执行退出时,又将输出形式參数和输入/输出形式參数数据复制到实际參数变量中。
3. 參数默认值
在CREATE OR REPLACE FUNCTION 语句中声明函数參数时能够使用DEFAULTkeyword为输入參数指定默认值。
具有默认值的函数创建后。在函数调用时,假设没有为具有默认值的參数提供实际參数值,函数将使用该參数的默认值。
但当调用者为默认參数提供实际參数时,函数将使用实际參数值。
在创建函数时,仅仅能为输入參数设置默认值,而不能为输入/输出參数设置默认值。
②创建过程
1.建立存储过程
在ORACLE SERVER上建立存储过程,能够被多个应用程序调用,能够向存储过程传递參数,也能够向存储过程传回參数.
创建过程语法:
CREATE[OR REPLACE] PROCEDURE Procedure_name
&&& [ (argment [ { IN| IN OUT }] Type,
&&& argment [ { IN| OUT| IN OUT} ] Type ]
&&& [ AUTHID DEFINER| CURRENT_USER ]
&&& &类型.变量的说明&
&&& &运行部分&
&&& &可选的异常错误处理程序&
2. 调用存储过程
ORACLE 使用EXECUTE语句来实现对存储过程的调用:
EXEC[UTE]& Procedure_name( parameter1, parameter2…);
在创建存储过程时, 可使用AUTHID CURRENT_USER 或AUTHID DEFINER 选项,以表明在运行该过程时Oracle 使用的权限.
1) 假设使用AUTHID CURRENT_USER 选项创建一个过程, 则Oracle 用调用该过程的用户权限运行该过程.
为了成功运行该过程,调用者必须具有訪问该存储过程体中引用的全部数据库对象所必须的权限
2) 假设用默认的AUTHID DEFINER 选项创建过程, 则Oracle 使用过程全部者的特权运行该过程.为了成功运行该过程,
过程的全部者必须具有訪问该存储过程体中引用的全部数据库对象所必须的权限. 想要简化应用程序用户的特权管理,
在创建存储过程时, 一般选择AUTHID DEFINER 选项–--这样就不必授权给须要调用的此过程的全部用户了.
④删除存储过程和存储函数
1.删除过程
能够使用DROP PROCEDURE命令对不须要的过程进行删除,语法例如以下:
DROP PROCEDURE [user.]Procudure_
2.删除函数
能够使用DROP FUNCTION 命令对不须要的函数进行删除,语法例如以下:
DROP FUNCTION [user.]Function_
[存储函数:有返回值。创建完毕后,通过select function()运行]
[存储过程:因为没有返回值,创建完毕后,不能使用select语句,仅仅能使用pl/sql块运行]
[格式]
--函数的声明(有參数的写在小括号中)
create or replace function func_name(v_param varchar2)
&--返回值类型
&return varchar2
&--PL/SQL块变量、记录类型、游标的声明(类似于前面的declare的部分)
&--函数体(能够实现增删改查等操作,返回值须要return)
&&&&&& return 'helloworld'|| v_
1 函数的 helloworld: 返回一个 &helloworld& 的字符串
create or replace function hello_func
return varchar2
&&&&&& return 'helloworld';
&&& dbms_output.put_line(hello_func());
或者: select hello_func()
2 返回一个&helloworld: atguigu&的字符串。当中atguigu 由运行函数时输入。
--函数的声明(有參数的写在小括号中)
create or replace function hello_func(v_logo varchar2)
--返回值类型
return varchar2
--PL/SQL块变量的声明
&&&&&& return 'helloworld'|| v_
3 创建一个存储函数,返回当前的系统时间
create or replace function func1
return date
--定义变量
&--v_date :=
&&&&&& select sysdate into v_
&&&&&& dbms_output.put_line('我是函数哦');
&&&&&& return v_
select func1
& v_date := func1;
& dbms_output.put_line(v_date);
4. 定义带參数的函数: 两个数相加
create or replace function add_func(a number, b number)
return number
&&&&&& return (a + b);
&&& dbms_output.put_line(add_func(12, 13));
&&& select add_func(12,13)
5. 定义一个函数: 获取给定部门的工资总和, 要求:部门号定义为參数, 工资总额定义为返回值.
create or replace function sum_sal(dept_id number)
&&&&&& return number
&&&&&& cursor sal_cursor is select salary from employees where department_id = dept_
&&&&&& v_sum_sal number(8) := 0;&&
&&&&&& for c in sal_cursor loop
&&&&&&&&&& v_sum_sal := v_sum_sal + c.
&&&&&&&&&&&&
&&&&&& --dbms_output.put_line('sum salary: ' || v_sum_sal);
&&&&&& return v_sum_
&&& dbms_output.put_line(sum_sal(80));
6. 关于 OUT 型的參数: 由于函数仅仅能有一个返回值, PL/SQL 程序能够通过 OUT 型的參数实现有多个返回值
要求: 定义一个函数: 获取给定部门的工资总和 和 该部门的员工总数(定义为 OUT 类型的參数).
要求: 部门号定义为參数, 工资总额定义为返回值.
create or replace function sum_sal(dept_id number, total_count out number)
&&&&&& return number
&&&&&& cursor sal_cursor is select salary from employees where department_id = dept_
&&&&&& v_sum_sal number(8) := 0;&&
&&&&&& total_count := 0;
&&&&&& for c in sal_cursor loop
&&&&&&&&&& v_sum_sal := v_sum_sal + c.
&&&&&&&&&& total_count := total_count + 1;
&&&&&&&&&&&&
&&&&&& --dbms_output.put_line('sum salary: ' || v_sum_sal);
&&&&&& return v_sum_
& v_total number(3) := 0;
&&& dbms_output.put_line(sum_sal(80, v_total));
&&& dbms_output.put_line(v_total);
7*. 定义一个存储过程: 获取给定部门的工资总和(通过 out 參数), 要求:部门号和工资总额定义为參数
create or replace procedure sum_sal_procedure(dept_id number, v_sum_sal out number)
&&&&&& cursor sal_cursor is select salary from employees where department_id = dept_
&&&&&& v_sum_sal := 0;
&&&&&& for c in sal_cursor loop
&&&&&&&&&& --dbms_output.put_line(c.salary);
&&&&&&&&&& v_sum_sal := v_sum_sal + c.
&&&&&&&&&&&&
&&&&&& dbms_output.put_line('sum salary: ' || v_sum_sal);
&&&& v_sum_sal number(10) := 0;
&&&& sum_sal_procedure(80,v_sum_sal);
8*. 自己定义一个存储过程完毕下面操作:
对给定部门(作为输入參数)的员工进行加薪操作, 若其到公司的时间在 (? , 95) 期间,&&& 为其加薪 %5
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& [95 , 98)&&&&&&&&&&&& %3&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& [98, ?)&&&&&&&&&&&&&& %1
得到下面返回结果: 为此次加薪公司每月须要额外付出多少成本(定义一个 OUT 型的输出參数).
create or replace procedure add_sal_procedure(dept_id number, temp out number)
&&&&&& cursor sal_cursor is select employee_id id, hire_date hd, salary sal from employees where department_id = dept_
&&&&&& a number(4, 2) := 0;
&&&&&& temp := 0;&&&&&&
&&&&&& for c in sal_cursor loop
&&&&&&&&&& a := 0;&&&
&&&&&&&&&& if c.hd & to_date('', 'yyyy-mm-dd') then
&&&&&&&&&&&&& a := 0.05;
&&&&&&&&&& elsif c.hd & to_date('', 'yyyy-mm-dd') then
&&&&&&&&&&&&& a := 0.03;
&&&&&&&&&& else
&&&&&&&&&&&&& a := 0.01;
&&&&&&&&&&
&&&&&&&&&&
&&&&&&&&&& temp := temp + c.sal *
&&&&&&&&&& update employees set salary = salary * (1 + a) where employee_id = c.
&&&&&&&&&&&&1403人阅读
存储过程的优点:
1.存储过程只在创造的时候进行编译,以后每次执行存储过程都不再需要重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.存储过程可以重复使用,可减少数据库开发人员的工作量
4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权
5.存储过程中可以结合PL/Sql进行简单的逻辑操作。
一:基本语法结构
1.基本结构
CREATE [OR REPLACE] PROCEDURE procedure_name
[(parameter1 [model][U1] datatype1,parameter2 [model] datatype2 …)]
END [procedure_name];
其中: procedure_name是存储过程的名字,parameter用于指定参数,model用于指定参数模式,datatype用于指定参数类型, IS [AS]用于开始PL/SQL代码块。
注:当定义存储过程的参数时,只能指定数据类型,不能指定数据长度
1)建立存储过程时,既可以指定存储过程的参数,也可以不提供任何参数。
2)存储过程的参数主要有三种类型:输入参数(IN)、输出参数(OUT)、输入输出参数(IN OUT),其中IN用于接收调用环境的输入参数,OUT用于将输出数据传递到调用环境,IN OUT不仅要接收数据,而且要输出数据到调用环境。
3)在建立存储过程时,输入参数的IN可以省略。 将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条。
CREATE OR REPLACE PROCEDURE pro_learing
p_para1 varchar2:=’参数一’,
p_para2 nvarchar2 default ‘参数二’,
p_para3 out varchar2,
p_para4 in out varchar2
v_para5 varchar2(20);
v_para5:=’输入输出:’||[U2] p_para4;
p_para3 := ‘输出:’||p_para1||p_para2;
p_para4 := v_para5;
片这里写代码片
CREATE OR REPLACE PROCEDURE query_emp
emp.empno%TYPE,
OUT emp.ename%TYPE,
salary OUT emp.sal%TYPE) IS
ename, sal INTO name, salary
END query_
–执行存储过程
emp_name emp.ename%TYPE;
emp.sal%TYPE;
query_emp(7369, emp_name, emp_sal);
创建存储过程
if条件的判断语法:
IF V_TEST=1 THEN
do someting
create or replace procedure myp12
test number(10);
if test=10 then
dbms_output.put_line(‘相同’);
dbms_output.put_line(‘不相同’);
end myp12;
WHILE V_TEST=1 LOOP
create or replace procedure mytest10
while flag=false loop
dbms_output.put_line(‘进入while循环’);
end mytest10;
–使用游标cursor
用for in 进行循环
游标定义:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:13625次
排名:千里之外
原创:27篇
(2)(1)(3)(5)(1)(4)(2)(1)(3)(3)(1)(1)(1)(1)

我要回帖

 

随机推荐