简体   繁体   English

将SQL Server / T-SQL查询转换为Oracle PL / SQL

[英]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 tableselect 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM