CREATE OR REPLACE PROCEDURE
swap(p1 IN out NUMBER, p2 IN out NUMBER) IS
v_temp NUMBER;
BEGIN
v_temp := p1;
p1 := p2;
p2 := v_temp;
END;
/DECLARE
num1 NUMBER := 100;
num2 NUMBER := 200;
BEGIN
swap(num1, num2);
DBMS_OUTPUT.PUT_LINE('num1 = ' || num1);
DBMS_OUTPUT.PUT_LINE('num2 = ' || num2);
END;
/为什么不能直接execute swap(100,200)?还有in out参数有什么区别?
swap(p1 IN out NUMBER, p2 IN out NUMBER) IS
v_temp NUMBER;
BEGIN
v_temp := p1;
p1 := p2;
p2 := v_temp;
END;
/DECLARE
num1 NUMBER := 100;
num2 NUMBER := 200;
BEGIN
swap(num1, num2);
DBMS_OUTPUT.PUT_LINE('num1 = ' || num1);
DBMS_OUTPUT.PUT_LINE('num2 = ' || num2);
END;
/为什么不能直接execute swap(100,200)?还有in out参数有什么区别?
解决方案 »
- 各位大虾帮忙,急急急。。。。。
- oracl查询加锁解锁
- 关于动态创建存储过程
- 实例恢复问题
- !!!!!初学oracle写了个触发器,执行时出现错误怎么办??
- 在SP中建立FUNCTION问题
- jxc(GameHeart) , zsfww1205,duanzilin(寻)请进
- 怎么将数据插入到 oracle92中表分区中呢?
- 怎样批量建表!新手万分感谢!
- asp.net 访问oracle报ORA-12154: TNS: could not resolve the connect identifier sp
- 如何把oracle中导出的.sql文件利用sqlplus导入
- oracle在物理上分为哪几种文件??
可以直接执行exec swap(100,200) 或者CALL swap(100,200),都是此命令需要在SQL*PLUS里执行,或者在PL/SQL DEV的COMMAND窗口里执行
in:传入参数
out:传出参数
使用了out参数的话 就必须要对你的p2进行赋值才可以 所以就不可以直接执行execute了
顺便说下:你的p2变量使用了in out参数 既可以是in 也可以是out 如果只是对p2输出的话 没问题
而你对其赋值的话 p2就变成了out参数的模式 这是就不能直接execute了
swap(p1 IN out NUMBER, p2 IN out NUMBER) IS
BEGIN
dbms_output.put_line(p1);
dbms_output.put_line(p2);
END;
/
如何这样写的话 直接执行execute swap(100,200)是没问题的
你的p1,p2变量使用了in out参数,如果只是对p1,p2输出的话 没问题
而你对其赋值的话p1, p2就变成了out参数的模式 这是就不能直接execute了
为什么我这执行不了?
CREATE OR REPLACE PROCEDURE
2 swap(p1 IN out NUMBER, p2 IN out NUMBER) IS
3 BEGIN
4 dbms_output.put_line(p1);
5 dbms_output.put_line(p2);
6 END;
7 /execute swap(100,200);
报错:
ORA-06550: 第 2 行, 第 12 個欄位:
PLS-00363: 表示式 '100' 無法作為指定目標使用
ORA-06550: 第 2 行, 第 16 個欄位:
PLS-00363: 表示式 '200' 無法作為指定目標使用
ORA-06550: 第 2 行, 第 7 個欄位:
PL/SQL: Statement ignored
如果这样写的话:
CREATE OR REPLACE PROCEDURE
swap(p1 IN out NUMBER, p2 IN out NUMBER) IS
v_temp NUMBER;
BEGIN
v_temp := p1;
p1 := p2;
p2 := v_temp;
DBMS_OUTPUT.PUT_LINE('num1 = ' || p1);
DBMS_OUTPUT.PUT_LINE('num2 = ' || p2);END;这样写的话在command window里是不行的,但是在sql window里却可以test,为什么会出现这样的情况?如果我在java中调用这个存储过程的话会不会出错呢?
答:因为你定义的swap过程的2个参数是in out型的,如果你这样调用swap(100,200)
的话,那么你怎么调用传出参数的值呀。
in 代表该参数是传入参数,该参数只能够放在=号的右边。
out代表该参数是传出参数,该参数只能够放在=号的左边。
in out代表该参数是传入传出型的,该参数放在=号的左右都行。
定义为out参数的变量一定要被外界调用吗?
哦,我好像有点理解了。。
你是说如果存储过程中定义了out参数,那么在调用的时候一定要传入out变量 。swap()中有两个out参数,那么在调用swap()的时候一定要传入两个out变量才行,而不是直接传入两个数值。
我理解的对吗?
既然你已经把相应的参数定义成了in out型的了,那就证明你想通过该参数进行传入和传出值了,你要想得到该参数的传出值,那么你就必须在过程外部定义一个变量来接收该传出值。向你现在这样的方式调用该过程(execute swap(1,2);),你根本就没有在过程外部定义变量来接收该传出值。如果你在过程外部不想定义参数来接收该传出值,就说明你在过程外部是不需要获取该参数值的(那么你也就没有必须把该参数定义成in out了),所以你把该参数的类型定义为in out那么就没有必要了,还不如直接定义成in,这样能够让人很明白你该参数的使用。