【问题标题】:Using table variables in Oracle Stored Procedure在 Oracle 存储过程中使用表变量
【发布时间】:2018-01-26 12:44:52
【问题描述】:

我在 T-SQL (MS SQL Server) 方面拥有丰富的经验。

首先选择一些记录集到一个
中是很常见的 表变量或说临时表t,然后使用此t
在整个 SP 主体中使用它,就像一张普通的桌子一样 (对于 JOINS、子查询等)。

现在我在 Oracle 中尝试同样的事情,但这很痛苦。 我一直出错,它一直在说
它无法识别我的表(即我的表变量)。

Error(28,7): PL/SQL: SQL Statement ignored
Error(30,28): PL/SQL: ORA-00942: table or view does not exist

我开始思考这有什么可能 表变量和什么不是(在 SP 正文中)?

我有这个声明:

TYPE V_CAMPAIGN_TYPE IS TABLE OF V_CAMPAIGN%ROWTYPE; 
tc V_CAMPAIGN_TYPE;

我现在可以在我的 SP 中用这个 tc 做什么?!

这就是我想要在 SP 中做的事情。

  UPDATE ( SELECT t1.STATUS_ID, t2.CAMPAIGN_ID
            FROM V_CAMPAIGN t1
            INNER JOIN tc t2 ON t1.CAMPAIGN_ID = t2.CAMPAIGN_ID
            ) z
  SET z.STATUS_ID = 4;

V_CAMPAIGN 是数据库视图,tc 是我的表变量

【问题讨论】:

  • 请发布完整代码。你可以使用dbfiddle.uk
  • table of 语法可能具有误导性。 tc 在您的示例中不是表格,而是集合。通常,这种类型的构造被替换为 with 子句或 Oracle 中的全局临时表。
  • 您总是可以使用 Oracle 支持的东西,例如临时表。
  • 在 Oracle 中,您通常甚至不使用临时表。您只需对真实的进行操作。只需加入您用来填充“表变量”的表
  • 也许你应该退后一步,描述你试图解决的潜在问题,而不是找到一种方法将 SQL Server 方法应用于 Oracle

标签: sql oracle plsql oracle11g


【解决方案1】:

大概您正在尝试更新 V_CAMPAIGN 记录的子集。 在 SQLServer 中,定义一个包含子集的“临时”表可能很有用,然后对其进行操作,这在 Oracle 中是不必要的。 只需使用用于定义临时表的 where 子句更新表。 例如

UPDATE v_campaign z
   SET z.status_id = 4
 WHERE z.column_name = 'a value'
   AND z.status <> 4

我假设您熟悉的技术是在选择数据时尽量减少读取锁定的影响。 Oracle 使用不同的锁定策略,因此该技术几乎是不必要的。

回应上面的评论 - 告诉我们您希望在 Oracle 中实现什么目标,您将获得有关最佳前进方向的建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    相关资源
    最近更新 更多