oracle存储过程练习
1. oracle 存储过程 求大神们帮帮忙
正文部分:
CREATE PROCEDURE sp_exec_35to41
@database varchar(60),@bzvarchar(5)
---创建存储过程 带2个参数
AS
begin
declare
@sqlstring varchar(2000)
--- 定义变量@sqlstring
alter table Acct_t_AcctItem disabletrigger all
---修改表 Acct_t_AcctItem 停止所有触发器
delete from Acct_t_AcctItem
---删除表 Acct_t_AcctItem 内容
set @sqlstring = 'insert into Acct_t_AcctItem SELECT AcctCode,AcctName,BalanceDir,Memoric,AuxDept,AuxEnterprise,AuxPerson,
AuxProject,EndFlag,AcctTypeID,Status,Breviary,TaxTypeID,AcctLvlID,SuperID,null,EndFlag,EndFlag,EndFlag,EndFlag
from ' + @database + '.dbo.Acct_t_AcctItem '
---设置字段@sqlstring的内容,内容是从定义的数据库:变量@database的表dbo.Acct_t_AcctItem复制列AcctCode,AcctName,BalanceDir,Memoric,AuxDept,AuxEnterprise,AuxPerson,
AuxProject,EndFlag,AcctTypeID,Status,Breviary,TaxTypeID,AcctLvlID,SuperID,null,EndFlag,EndFlag,EndFlag,EndFlag到表Acct_t_AcctItem
exec(@sqlstring)
---执行语句
alter table Acct_t_AcctItem enabletrigger all
---修改表 Acct_t_AcctItem 启动所有触发器
return
end
---这个存储过程的意思是把表Acct_t_AcctItem内容清除,再从指定数据库的表Acct_t_AcctItem复制内容到Acct_t_AcctItem,数据库名称由执行存储过程的时候指定,sp_exec_35to41@database varchar(60)---数据库名称,@bzvarchar(5)---没有用
2. ORACLE 存储过程问题
使用包返回存储过程结果集,例子:
create or replace package pkg_return_table
is
type c1 is ref
cursor;
procere p_return_table(v_c1 out c1); --定义存储过程返回一个结果集
function f_return_table return pkg_return_table.c1; --定义函数返回一个结果集
procere
p_return_table1(v_id int,v_c1 out c1,v_c2 out c1);
--定义存储过程返回多个结果集
end;
/
create or replace package body pkg_return_table
is
procere
p_return_table(v_c1 out c1)
is
begin
open v_c1 for select * from
student;
end p_return_table;
function f_return_table return
pkg_return_table.c1
is
v_c1 pkg_return_table.c1;
begin
open v_c1 for select * from student;
return v_c1;
end
f_return_table;
procere p_return_table1(v_id int,v_c1 out c1,v_c2 out
c1)
is
sqlstr varchar2(500);
begin
sqlstr:='select * from
student';
open v_c1 for sqlstr; --使用动态sql
sqlstr:='select * from
student where id=:w_id';
open v_c2 for sqlstr using v_id; --动态sql传参
end p_return_table1;
end pkg_return_table;
/
--存储过程调用
variable v_c1 REFCURSOR;
exec
pkg_return_table.p_return_table(:v_c1);
print v_c1;
--存储过程调用
variable v_c1 REFCURSOR;
variable
v_c2 REFCURSOR;
exec
pkg_return_table.p_return_table1(1,:v_c1,:v_c2);
print v_c1;
print
v_c2;
--函数调用
select pkg_return_table.f_return_table()
from al;
重点是定义游标变量,获取存储过程结果集,然后Open游标,就跟平常的游标一样的操作啦
不用包应该也可以的,定义REFCURSOR变量即可
希望能解决您的问题。
3. ORACLE的存储过程问题
在网上搜了某帅哥的解决方案,希望对你有用!你的这个错误,我也没遇到过,也学习下!
ORA-29282 UTL_FILE不能用,File handle does not exist.可如下操作:
1.创建directory(电脑相应的路径一定要存在,并且注意要用大写来创建,它会区分大小写)
如:create directory utl_file_dir as 'd:\temp\utl_file';
2.授予权限
如:grant read,write on directory utl_file_dir to 用户;
3.可查看是否生成:
如: select * from all_directories;
4.如对所设的directory不满意,可对其进行取消,
如: drop directory utl_file_dir;
4. Oracle 定义存储过程 不能执行,处于无效状态。
无效状态有两种可能,一种是你的存储过程编辑没有成功,创建了,但里面有语法错误。
还有一种是存储过程使用的表有结构上的改变,需要重新编译一下。
你重新编译一下,如果不成功,就是有语法问题,你需要修改存储过程。
5. 如何oracle调试存储过程
1.打开PL/SQL Developer 如果在机器上安装了PL/SQL Developer的话,打开PL/SQL Developer界面 输入用户名,密码和host名字,这个跟在程序中web.config中配置的完全相同,点击确定 找到需要调试的存储过程所在的包(Package bodies),如PACK_ACTIVITY,点击右键,在弹出菜单中选择[查看],得到包中的所有存储过程和他们的代码. 2.添加debug信息 为了能够单步跟踪存储过程,需要为其所在的包添加debug信息,右键点击需要调试的包,在弹出菜单中选中[添加调试信息]. 这样就为包体添加了调试信息。 3.调试存储过程 现在所有的准备工作都做好了,可以调试跟踪存储过程了。 选择需要调试的存储过程,点击右键,在弹出菜单中选择[测试],进去测试窗口. 测试窗口中有为了测试该存储过程自动所产生的代码,当然你也可以自己另外加入和修改代码,对于我们目前只是为了调试存储过程,自动生成的代码已经足够了。接着按照如下的步骤进行调试。 (1)添加存储过程所需要的参数,我们项目中的大多数存储过程都是需要参数的,参数可以在测试窗口右下部分输入。 如:GetPanNO_New需要一个输入参数v_employeeid,我们输入180,输出参数是mycursor,是查看结果的,不需要输入任何值。 (2)开始调试,点击[调试]菜单-[开始](或者按F9),就进去调试模式了,程序开始停在begin这一行. (3)以后的调试过程跟我们熟悉的的调试过程就一样了: 运行(Ctrl+R) 单步进入(Ctrl+N) 单步跳过(Ctrl+O) 单步退出(Ctrl+T) 或者点击debug工具条上的按扭: 当按Ctrl+N进去存储过程的源代码中后 在这个窗口中可以查看过程中的变量值和堆栈。 (4)调试运行完了后,可以查看结果如下(点击mycursor变量旁边的按钮).
6. 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;
7. oracle存储过程如何输出信息
可用DBMS_OUTPUT.PUT_LINE()对存储过程的进行输出。
编写存储过程:
create or replace procere test_pro(in_num number)
as
M number;
begin
M := in_num;
if 0 < M then
dbms_output.put_line('输出SQL语句1');
elsif M < 3 then
dbms_output.put_line('输出SQL语句2');
else
dbms_output.put_line('nothing');
end if;
end;
(7)oracle存储过程练习扩展阅读;
存储在数据库的数据字典中,存储在当前的应用中安全性由数据库提供安全保证,必须通过授权才能使用存储子程序,安全性靠应用程序来保证,如果能执行应用程序,就能执行该子程序。模式描述IN参数用来从调用环境中向存储过程传递值,不能给IN参数赋值,给此参数传递的值可以是常量、有值的变量、表达式等。
8. 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单步调试
9. 用 Oracle 存储过程编写一个简单的程序,要求
Oracle存储过程开发的要点是:
• 使用Notepad文本编辑器,用Oracle PL/SQL编程语言写一个存储过程;
• 在Oracle数据库中创建一个存储过程;
• 在Oracle数据库中使用SQL*Plus工具运行存储过程;
• 在Oracle数据库中修改存储过程;
• 通过编译错误调试存储过程;
• 删除存储过程;
二.环境配置
包括以下内容:
• 一个文本编辑器Notepad;
• Oracle SQL*Plus工具,提交Oracle SQL和PL/SQL 语句到Oracle database。
• Oracle 10g express数据库,它是免费使用的版本;