【问题标题】:Executing procedure in oracle without any parameters在oracle中执行没有任何参数的过程
【发布时间】:2019-03-14 13:41:09
【问题描述】:

我在 oracle 中有以下程序:

CREATE OR REPLACE PROCEDURE usp_Templates_Load_TruncateRawTables
AS
BEGIN

EXECUTE IMMEDIATE 'TRUNCATE TABLE TBLTEMPLATES_LOAD_OTHEROBJECTS_RAW';
EXECUTE IMMEDIATE 'TRUNCATE TABLE TBLTEMPLATES_LOAD_NOTES_RAW';
EXECUTE IMMEDIATE 'TRUNCATE TABLE TBLTMPLTS_LOAD_INCSTATEMT_RAW';
EXECUTE IMMEDIATE 'TRUNCATE TABLE TBLTMPLTS_LOAD_BALANCESHEET_RAW';
EXECUTE IMMEDIATE 'TRUNCATE TABLE TBLTEMPLATES_LOAD_OTHERBANK_RAW';
END;

这个过程没有任何输入或输出参数,我试图执行这个过程如下:

Execute usp_Templates_Load_TruncateRawTables;

我尝试的另一种方法是:

Begin
usp_Templates_Load_TruncateRawTables;
End;

但两次,我都收到错误消息:

ORA-00942: 表或视图不存在

ORA-06512:在“TC_OWNER.USP_TEMPLATES_LOAD_TRUNCATERAWTABLES”第 8 行

ORA-06512:在第 1 行

如何正确执行此过程以获得正确的输出。

【问题讨论】:

  • 这个错误清楚地表明你正在尝试删除一个不存在的表;这与您调用该过程的方式无关。如果您希望您的过程在表不存在时不出错,请添加一些异常处理
  • TBLTMPLTS_LOAD_BALANCESHEET_RAWTBLTEMPLATES_LOAD_OTHERBANK_RAW 的长度为 32 个字符,TBLTEMPLATES_LOAD_OTHEROBJECTS_RAW 的长度为 34 个字符。所以这些不是有效的 Oracle 对象名称。除非您使用的是带有长标识符的 12c R2,否则您应该这样说。
  • 显然您以TC_OWNER 登录。那是您的过程中命名的表所在的架构吗?如果不是,您需要在 TRUCATE 语句中包含架构的名称。祝你好运。
  • 这实际上是由于架构中的一个表无效引起的,修复它解决了问题。

标签: oracle plsql


【解决方案1】:

解决方案 1 - 添加所有者/模式名称

CREATE OR REPLACE PROCEDURE TC_OWNER.usp_Templates_Load_TruncateRawTables
AS
BEGIN

    EXECUTE IMMEDIATE 'TRUNCATE TABLE schema2.TBLTEMPLATES_LOAD_OTHEROBJECTS_RAW';
    . . . . 
END;

只要执行模式具有执行模式的权限,模式就可以不同。我为视觉效果添加了TC_OWNER.usp_Tem...

解决方案 2 - 作为这些表的所有者执行

connect schema2/password @sid

执行

BEGIN

    EXECUTE IMMEDIATE 'TRUNCATE TABLE TBLTEMPLATES_LOAD_OTHEROBJECTS_RAW';
    . . . . 
END;

【讨论】:

    猜你喜欢
    • 2014-06-14
    • 2018-09-27
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    相关资源
    最近更新 更多