0

谁能帮我把这段代码转换成 Oracle SQL?或者请告诉我为什么这会在 Oracle SQL 上引发错误?

declare @PropertyName varchar(64)
set @PropertyName= 'ESRegion'
select PD.PropertyId,
PD.PropertyName,
convert(varchar(255), v.Value ) DisplayValue
from Property_Dictionary PD WITH(READUNCOMMITTED) 
inner join CorpTax_LookupDefinition l on l.Lookupkey = pd.ReferenceType
join MDTable md on l.DataDictionaryTypeId = md.TableGUID 
join ValueChar v on 
(
v.TableID = md.TableID 
and v.AttributeID = l.DisplayAttributeId 
)
where PD.DataTypeid = 7
and PD.PropertyName = @PropertyName
4

3 回答 3

0

这里有非SQL。你是说 T/SQL 到 PL/SQL 吗?另外,我认为在 Oracle 中不允许使用 WITH(READUNCOMITTED),因为在 Oracle 中不允许未读未提交(如果您需要能够进行脏读,您可以更改事务隔离)。最后,我认为 convert 使用不正确。

于 2012-08-17T20:23:20.943 回答
0

在 SQL*Plus 中,您可以执行以下操作:

define PropertyName='ESRegion'
SELECT PD.PropertyId, PD.PropertyName, v.Value DisplayValue 
  FROM Property_Dictionary PD 
         INNER JOIN CorpTax_LookupDefinition l 
                 ON l.Lookupkey = pd.ReferenceType 
               JOIN MDTable md ON l.DataDictionaryTypeId = md.TableGUID
               JOIN ValueChar v ON ( v.TableID = md.TableID  AND
                                     v.AttributeID = l.DisplayAttributeId  )
 WHERE PD.DataTypeid = 7 
   AND PD.PropertyName = '&PropertyName';

DEFINE 替换原始代码中的 DECLARE 和 SET。然后,您将在查询中使用 DEFINE 的变量。

于 2012-08-17T20:53:09.240 回答
0

这应该有效:

select PD.PropertyId, PD.PropertyName, cast(v.value as varchar(255)) as DisplayValue
from Property_Dictionary PD inner join
     CorpTax_LookupDefinition l
     on l.Lookupkey = pd.ReferenceType join
     MDTable md
     on l.DataDictionaryTypeId = md.TableGUID join
     ValueChar v
      on v.TableID = md.TableID and
         v.AttributeID = l.DisplayAttributeId 
where PD.DataTypeid = 7 and PD.PropertyName = 'ESRegion'

正如其他地方所提到的,这有点不同。它将调用表上的读锁。如果您关心这一点,那么您需要研究用于锁定的不同 Oracle 选项。我将 CONVERT 更改为 CAST。目前尚不清楚 v.value 的类型是什么,但这应该可以。(对于某些类型, to_char() 会更好。)

我还将变量直接放入查询中。如果你想要变量,那么你就超出了 SQL 的范围,进入了 PL/SQL 和 TSQL 的领域。

于 2012-08-17T20:55:11.717 回答