[英]Convert SQL Server / T-SQL query to Oracle PL/SQL
I have a SQL Server T-SQL query that I need to translate to Oracle PL-SQL. 我有一个SQL Server T-SQL查询,我需要将其转换为Oracle PL-SQL。
My SQL Server query is: 我的SQL Server查询是:
DECLARE @inputData
BEGIN
SELECT @inputData = column_name
FROM table;
END
What does select DECLARE variable = column_name from any table
do? select DECLARE variable = column_name from any table
中select DECLARE variable = column_name from any table
什么?
EDIT 编辑
I have tried on my own to research this but cannot a find proper explanation. 我已经尝试过自己进行研究,但是找不到适当的解释。 SOme of so called expert here did not like the small block of code here is my entire procedure which I am trying to translate for oracle.
这里所谓的专家SOme不喜欢这里的一小段代码,这是我试图为oracle翻译的整个过程。
USE [Mon422_GA]
GO
/****** Object: StoredProcedure [dbo].[p_DisbAmtCheck] Script Date: 1/18/2017 11:33:19 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[p_DisbAmtCheck]
(
@amount decimal(18,2),
@type nvarchar(10),
@id int,
@app_id int,
@loan_id int,
@disb_fee_id int = 0,
@disb_cs_fees nvarchar(255) = '0'
)
AS
BEGIN
DECLARE @TOTAL_DISB decimal(18,2), @DISB_DISB decimal(18,2), @FEE_DISB decimal(18,2),
@WRK_TOTAL decimal(18,2), @CUR_DISB decimal(18,2), @FEE_CLOSE char(1),
@FEE_FIN char(1), @TMP_SQL nvarchar(512)
SET @TOTAL_DISB = 0.00
SET @DISB_DISB = 0.00
SET @FEE_DISB = 0.00
SET @WRK_TOTAL = 0.00
SET @CUR_DISB = 0.00
IF @type NOT LIKE 'cs_disb'
BEGIN
SELECT @DISB_DISB = SUM(d.disburse_amt)
FROM t_ccs_disburse d, t_ccs_loan_disburse_rel ldr, t_ccs_app_loan_rel alr
WHERE ldr.disburse_id = d.disburse_id AND ldr.loan_id = alr.loan_id
AND alr.app_id = @app_id AND alr.loan_id = @loan_id
AND d.disburse_loan_fee_ind != 'F'
END
IF @DISB_DISB IS NULL
SET @DISB_DISB = 0.00
IF @type NOT LIKE 'cs_fee'
BEGIN
SET @TMP_SQL = 'SELECT SUM(f.fee_amt)
FROM t_ccs_fee f, t_ccs_app_fee_rel r
WHERE r.fee_id = f.fee_id
AND r.app_id = ' + CONVERT(NVARCHAR, @app_id) +
' AND r.loan_id = ' + CONVERT(NVARCHAR, @loan_id) + '
AND (fee_financed_yn = ''Y'' OR fee_collect_at_closing_yn = ''Y'')
AND f.fee_id NOT IN ('
IF LEN(@disb_cs_fees) > 0
SET @TMP_SQL = @TMP_SQL + @disb_cs_fees + ')'
ELSE
SET @TMP_SQL = @TMP_SQL + '0)'
EXEC ('DECLARE fees CURSOR FOR '+ @TMP_SQL)
OPEN fees
FETCH NEXT FROM fees INTO @FEE_DISB
CLOSE fees
DEALLOCATE fees
END
IF @FEE_DISB IS NULL
SET @FEE_DISB = 0.00
SELECT @TOTAL_DISB = ln_amount FROM t_ccs_loan WHERE loan_id = @loan_id
IF @TOTAL_DISB IS NULL
SET @TOTAL_DISB = 0.00
SET @WRK_TOTAL = @DISB_DISB + @FEE_DISB + @amount
IF @WRK_TOTAL IS NULL
SET @WRK_TOTAL = 0.00
IF @id > 0
BEGIN
IF @type LIKE 'fee'
SELECT @CUR_DISB = fee_amt FROM t_ccs_fee WHERE fee_id = @id
ELSE IF @type LIKE 'disb'
SELECT @CUR_DISB = disburse_amt FROM t_ccs_disburse WHERE disburse_id = @id
ELSE
SET @CUR_DISB = 0.00
IF @CUR_DISB IS NULL
SET @CUR_DISB = 0.00
END
ELSE
BEGIN
SET @CUR_DISB = 0.00
IF @type LIKE 'disb'
BEGIN
-- check to see if this fee is financed or collect at close if so subtract from total
SELECT @FEE_FIN = fee_financed_yn, @FEE_CLOSE = fee_collect_at_closing_yn
FROM t_ccs_fee WHERE fee_id = @disb_fee_id
IF @FEE_FIN = 'Y' OR @FEE_CLOSE = 'Y'
SET @WRK_TOTAL = @WRK_TOTAL - @amount
END
END
SET @WRK_TOTAL = @WRK_TOTAL - @CUR_DISB
IF @WRK_TOTAL > @TOTAL_DISB
SELECT '0' as PASSED
ELSE
SELECT '1' as PASSED
END I dont think its duplicate of any question so Intially I had just posted small portion of my code. 结束我不认为它是任何问题的重复,因此最初我只是发布了我代码的一小部分。 Since some of so called expert did not like it so here is my complete code that needs to be translated in oracle.
由于某些所谓的专家不喜欢它,因此这是我的完整代码,需要在oracle中进行翻译。 Which I have done but i had hard time understanding the case
我已经做了,但是我很难理解此案
What does select anydeclaredvariable = column_name from anytable does? 从anytable中选择anydeclaredvariable = column_name是什么?
variable = column_name
变量= column_name
assigns column's value to your variable. 将列的值分配给变量。
Something like this should work in Oracle: 像这样的事情在Oracle中应该起作用:
declare
input_data my_table.my_column%type;
begin
select my_column into input_data from my_table where /* some predicate(s) */;
end;
/
Your question asks 您的问题问
What does
DECLARE variable = column_name
do?DECLARE variable = column_name
是什么?
The statement: DECLARE @Variable int = 5
will create the variable named @Variable
and initialize its contents to the value 5
. 语句:
DECLARE @Variable int = 5
将创建名为@Variable
的变量,并将其内容初始化为值5
。
If your question instead is: "What does SELECT @inputData = column_name FROM table
do?", then the answer is that it assigns the value returned for column_name
to the variable @inputData
. 如果您的问题是:“
SELECT @inputData = column_name FROM table
什么作用?”,那么答案是它将为column_name
返回的值分配给变量@inputData
。
I hope this answers your question. 我希望这回答了你的问题。
Important difference between MS Sql and Oracle is that in MS MS Sql和Oracle之间的重要区别在于MS中的区别
SELECT @inputData = column_name FROM table;
runs OK even with no predicates ie with multirows result set, returning the value of column_name
from an arbitrary row. 即使没有谓词也可以正常运行,即具有多行结果集,并从任意行返回
column_name
的值。 In Oracle 在甲骨文
SELECT column_name INTO input_data FROM my_table;
will fail if the result set contains more then one row. 如果结果集包含多于一行,将失败。 You shouldn't just translate syntax thoughtlessly.
您不应该仅仅考虑语法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.