Oracle中在一个procedure中调用其他的procedure;
这种方式可行吗?常用吗?
有什么要注意的吗?
可行,直接调用存过名.方法名就行了,比如需要调用名称为 PROCEDUREA存过的 functionb方法,直接在你的存过中写
PROCEDUREA.functionb(),如果需要参数就在括号里边按照正确顺序写上参数就行
假如有procedureA、procedureB和procedureC,因为数据依赖关系,需要先执行procedureA,再执行procedureB,再执行procedureC,
于是新建了个procedureTEST,
CREATE OR REPLACE PROCEDURE procedureTEST AS
BEGIN
procedureA();
procedureB();
procedureC();
EXCEPTION WHEN OTHERS THEN
ROLLBACK;
RAISE_APPLICATION_ERROR(-20001, 'PROCEDURE ERROR: ' || SQLERRM);
END;
procedureA、procedureB和procedureC 中都有错误处理,
如果procedureA、procedureB正常执行了,procedureC()报错了,因为procedureTEST是一个事务,整个procedureTEST会回滚;
那么procedureA、procedureB中执行的内容会回滚吗?
如果A,B中没有任何commit提交事务,procedureTEST中procedureC执行之前也没有commit提交语句,那么就是回滚所有的事务,如果在异常之前有提交,那么就只能回滚异常到前一步commit之前的数据
这肯定可以的。你遇到什么样的问题了?
该回答引用GPTᴼᴾᴱᴺᴬᴵ
在Oracle中,在一个procedure中调用其他的procedure是可行的,也是很常见的。这种方式可以帮助我们更好地组织代码,提高代码的可重用性和可维护性。
要注意以下几点:
存储过程的参数传递。当调用一个存储过程时,需要传递正确的参数,并确保参数的类型和顺序与被调用的存储过程相匹配。
调用存储过程的权限。确保当前用户拥有调用被调用存储过程的权限。
存储过程中的事务处理。当在存储过程中调用其他存储过程时,需要注意每个存储过程是否需要在自己的事务中执行,还是可以在外部的事务中执行。
存储过程的错误处理。需要确保在存储过程中调用其他存储过程时,错误处理是正确的。可以使用异常处理和日志记录等机制来处理错误。
至于损失函数的选择,这取决于具体的问题和模型。常见的损失函数包括均方误差(MSE)、交叉熵(Cross Entropy)等。在选择损失函数时,需要考虑模型的特性以及所要解决的问题的特性。
参考GPT和自己的思路,在Oracle中,在一个procedure中调用另一个procedure是完全可行的,而且这是很常见的一种编程技巧。
调用另一个procedure的方式可以通过使用PL/SQL中的CALL语句或通过在另一个procedure中直接调用另一个procedure的名称。
以下是一个简单的例子,演示如何在一个procedure中调用另一个procedure:
CREATE OR REPLACE PROCEDURE first_proc AS
BEGIN
second_proc; --调用另一个procedure
END;
CREATE OR REPLACE PROCEDURE second_proc AS
BEGIN
DBMS_OUTPUT.PUT_LINE('This is the second procedure');
END;
需要注意的一些事项包括:
1.调用另一个procedure时需要确保另一个procedure已经存在,并且已经编译通过。
2.在调用过程之前,需要确保在当前会话中已经连接到了正确的数据库,并且已经具有调用该过程的权限。
3.在调用过程时,需要确保传递正确的参数,或者在目标过程中定义一些默认值。
4.在编写复杂过程的时候,需要确保遵循最佳实践,例如避免出现无限递归,确保使用正确的异常处理等。
总之,调用另一个procedure是一种非常有用和常见的技巧,可以帮助我们更好地组织和管理代码,并实现更高效的数据库应用程序。
可行,PROCEDURE其实可以看着一个functionb方法 另外的PROCEDURE 直接调用functionb
该回答引用GPT
在Oracle中,在一个存储过程中调用其他存储过程是完全可行和常见的做法。这种做法可以提高代码的重用性和可维护性,同时也可以使代码更加模块化和易于管理。
在调用其他存储过程时,有一些要注意的事项:
确保被调用的存储过程已经存在,并且具有正确的参数和返回值。否则,可能会出现运行时错误。
确保被调用的存储过程在调用它的存储过程的权限范围内。如果存储过程是在另一个模式或用户下创建的,调用它时需要使用完整的限定名称(例如,模式名.存储过程名)。
确保被调用的存储过程不会修改调用它的存储过程的数据或状态,除非这是有意为之的。如果需要修改调用存储过程的数据或状态,应该在被调用的存储过程中使用明确的参数来传递这些数据或状态。
在编写存储过程时,应该遵循良好的编程实践,如使用注释、异常处理和错误检查,以确保代码的健壮性和可读性。
综上所述,调用其他存储过程是一种可行且常用的做法,但需要注意一些细节,以确保代码的正确性和可维护性。
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
在Oracle中,在一个procedure中调用其他的procedure是可行且常见的方式。这种方式可以提高代码的可复用性和模块化程度。具体步骤如下:
CREATE OR REPLACE PROCEDURE procedure1
IS
BEGIN
DBMS_OUTPUT.PUT_LINE('This is procedure1');
procedure2; --在procedure1中调用procedure2
END;
CREATE OR REPLACE PROCEDURE procedure2
IS
BEGIN
DBMS_OUTPUT.PUT_LINE('This is procedure2');
END;
procedure2
的名称调用该procedure。EXECUTE procedure1;
通过这种方式,可以在一个procedure中方便地调用其他的procedure,实现代码的复用和模块化。
需要注意的是,在调用其他procedure时,需要确保该procedure已经存在于当前schema中,否则会抛出异常。另外,如果被调用的procedure有参数,需要在调用时传入正确的参数。
如果我的回答解决了您的问题,请采纳!
调用没有问题,很常用。用户自己的存储过程间调用没有特殊注意事项。
不同用户的存储过程间调用需要注意,调用其它用户的存储过程需要被授予可执行权限。
通过role被赋予的其它用户表的操作权限(隐式授权),在存储过程中无效。selet from xx.tablex 正常,在存储过程中执行报对象不存在。需要 显示式授权:例子 grant select on xx.tablex to yy;
在Oracle中,在一个Procedure中调用其他Procedure是可行的,也是很常见的做法。这种方式可以将程序逻辑分成多个较小的模块,使得程序更易于维护和理解。
在使用这种方式时,需要注意以下几点:
子程序的调用顺序应该合理,确保每个子程序都能够在正确的时刻被调用到。
在调用子程序时,需要保证传入正确的参数,否则可能会出现错误。
子程序中的变量应该避免与主程序中的变量重名,以免造成命名冲突。
子程序中的异常处理应该与主程序保持一致,以便更好地进行错误处理和调试。
总之,在使用这种方式时,需要充分理解程序的逻辑,并进行充分测试和调试,以确保程序能够正常运行。
可以的,直接调用即可,不过要注意参数