在Oracle存储过程中使用表变量

时间:2018-01-26 12:44:52

标签: sql oracle plsql oracle11g

我有很多使用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是我的表变量

1 个答案:

答案 0 :(得分:2)

据推测,您正在尝试更新V_CAMPAIGN记录的子集。 在SQLServer中,定义一个临时的'包含该子集的表,然后进行操作,这在Oracle中是不必要的。 只需使用您用于定义临时表的where子句更新表。 E.g。

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

我认为您熟悉的技术是尽量减少选择数据时读取锁定的影响。 Oracle使用不同的锁定策略,因此该技术基本上是不必要的。

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