【发布时间】:2013-01-29 10:50:24
【问题描述】:
我想手动将存储过程从 T-SQL(MS SQL Server 2008) 转换为 P-SQL(Oracle DB 11g)。我最近尝试使用 SQL Developer 和 SwisSQL Tool 转换此过程,但没有成功。这个存储过程包含一个参数@sptotest,用于搜索一个单词。代码如下:
T-SQL:
CREATE PROCEDURE sp_name @sptotest sysname AS
DECLARE @d datetime,
@tookms int,
@cnt int,
@single_email varchar(80),
@word varchar(50)
DECLARE @testwords TABLE
(no int NOT NULL PRIMARY KEY,
word varchar(80) NOT NULL)
CREATE TABLE #temp(person_id int NOT NULL PRIMARY KEY,
first_name nvarchar(50) NULL,
last_name nvarchar(50) NOT NULL,
birth_date datetime NULL,
email varchar(80) NOT NULL)
SELECT TOP 1 @single_email = email
FROM persons
WHERE person_id BETWEEN 321106 AND 325000 AND email LIKE '%.com'
ORDER BY person_id
INSERT @testwords(no, word)
SELECT 1, 'joy'
UNION ALL
SELECT 4, @single_email
PRINT '------------------ Testing ' + ' ' + quotename(@sptotest) + ' ----'
DECLARE cur CURSOR STATIC LOCAL FOR
SELECT word FROM @testwords ORDER BY no
OPEN cur
WHILE 1 = 1
BEGIN
FETCH cur INTO @word
IF @@fetch_status <> 0
BREAK
TRUNCATE TABLE #temp
CHECKPOINT
DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS
SELECT @d = getdate()
INSERT #temp
EXEC @sptotest @word
SELECT @tookms = datediff(ms, @d, getdate())
SELECT @cnt = COUNT(*) FROM #temp
PRINT ltrim(str(@tookms)) + ' ms, ' +
ltrim(str(@cnt)) + ' rows. Word = "' + @word + '".'
TRUNCATE TABLE #temp
SELECT @d = getdate()
INSERT #temp
EXEC @sptotest @word
SELECT @tookms = datediff(ms, @d, getdate())
SELECT @cnt = COUNT(*) FROM #temp
PRINT ltrim(str(@tookms)) + ' ms, ' +
ltrim(str(@cnt)) + ' rows. Word = "' + @word + '". Data in cache.'
END
DEALLOCATE cur
提前致谢。
【问题讨论】:
-
你可能想花几句话来谈谈存储过程应该做什么以及你的翻译有什么问题。
-
您好,欢迎来到 Stack Overflow!首先,翻译通常是题外话,但是当你发布了你想要翻译的内容时,谢谢!这使您的问题变得更好,更容易回答。但是,我们还需要知道您的翻译有什么问题。为什么它不起作用?你有没有得到任何错误,它们是什么?它不提供相同的结果吗?您期望的结果是什么?尝试执行的程序是什么?
-
大多数情况下,您不需要在 Oracle 中使用临时表的所有这些变通方法,因为 Oracle 在您选择行时不会锁定它们。如果您可以只使用一个查询,那么在 Oracle 中会更好
标签: sql tsql stored-procedures plsql oracle11g