【问题标题】:Convert SQL Server / T-SQL query to Oracle PL/SQL将 SQL Server/T-SQL 查询转换为 Oracle PL/SQL
【发布时间】:2017-06-03 05:23:15
【问题描述】:

我有一个 SQL Server T-SQL 查询,需要将其转换为 Oracle PL-SQL。

我的 SQL Server 查询是:

DECLARE @inputData

BEGIN 
    SELECT @inputData = column_name 
    FROM table;
END

select DECLARE variable = column_name from any table 是做什么的?

编辑

我已尝试自行研究此问题,但找不到合适的解释。 这里的一些所谓的专家不喜欢这里的一小段代码,这是我试图为 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

结束 我不认为它与任何问题重复,所以最初我刚刚发布了我的代码的一小部分。由于一些所谓的专家不喜欢它,所以这是我需要在 oracle 中翻译的完整代码。我做过,但我很难理解这个案子

做什么 select anydeclaredvariable = column_name from anytable 呢?

【问题讨论】:

  • 当您搜索“SQL Server 变量”时,答案就在谷歌的第一个链接中。听起来你没有做太多研究。
  • 这里有答案:link
  • 在堆栈溢出时收集积分并不会让您成为专家,我希望投票可以满足您的自我,但对其他人没有帮助。而且它不是上述链接的重复,它已经被其他人在这里回答了

标签: sql sql-server tsql plsql


【解决方案1】:

MS Sql 和 Oracle 的重要区别在于 MS 中

SELECT @inputData = column_name FROM table;

即使没有谓词也能正常运行,即多行结果集,从任意行返回 column_name 的值。在甲骨文中

SELECT column_name INTO input_data FROM my_table;

如果结果集包含多于一行,则将失败。 你不应该只是随便翻译语法。

【讨论】:

  • 我只是想了解我发现在 sql server 中它的目的是从单行中检索列值。谢谢它达到了我的目的。
  • 感谢 serg 抽出宝贵时间帮助它解决了我的问题。但我不知道为什么我会因为真正的问题而被否决
  • 我认为即使查询可能在具有多行的 SQL 服务器中运行,但您无法确定哪一行将提供值这一事实足以使该结构不适合任何数据库查询我所做的,
  • @Manoj ,我认为原因是SELECT @DISB_DISB = SUM(d.disburse_amt) FROM ..SELECT @var = column_x FROM .. 截然不同。第一个只返回一行,第二个的结果是不可预测的。我猜如果从真正的查询开始,你不会被否决。
  • Serg,我的目的只是为了理解单行,所以不想发布整个查询页面,你帮助并解释了这一切,这符合我的目的。谢谢
【解决方案2】:

变量 = 列名

将列的值分配给您的变量。

这样的东西应该可以在 Oracle 中工作:

declare
  input_data my_table.my_column%type;
begin
  select my_column into input_data from my_table where /* some predicate(s) */;
end;
/

【讨论】:

    【解决方案3】:

    你的问题

    DECLARE variable = column_name 是做什么的?

    语句:DECLARE @Variable int = 5 将创建名为@Variable 的变量并将其内容初始化为值5

    如果您的问题是:“SELECT @inputData = column_name FROM table 是做什么的?”,那么答案是将column_name 返回的值分配给变量@inputData

    我希望这能回答你的问题。

    【讨论】:

      猜你喜欢
      • 2013-11-08
      • 2022-01-12
      • 1970-01-01
      • 2019-03-01
      • 2014-03-31
      • 1970-01-01
      • 2015-09-16
      • 2016-07-29
      • 1970-01-01
      相关资源
      最近更新 更多