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; --结束存储过程。