我有很多使用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
是我的表变量
答案 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中实现的目标,并获得最佳前进方案的建议。