2017-01-18 140 views
-1

我有一個需要轉換爲Oracle PL-SQL的SQL Server T-SQL查詢。將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辦?

編輯

我曾嘗試對我自己的研究這一點,但無法找到一個適當的解釋。 這裏所謂的專家的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 我不認爲它的任何問題的重複這樣Intially我剛剛發佈我的代碼小部分。由於一些所謂的專家不喜歡它,所以這裏是我需要在oracle中進行翻譯的完整代碼。我曾問過,但我有很難理解這是什麼 選擇anydeclaredvariable =列名來自anytable做的情況下

+0

當你搜索「SQL Server變量」時,答案就是谷歌的第一個鏈接。聽起來不像你做了很多研究。 – dfundako

+0

這裏你有一個答案:[link](http://stackoverflow.com/questions/10886568/how-do-i-declare-and-use-variables-in-pl-sql-like-i-do-in -t-sql) – M84

+0

在堆棧溢出收集點不會讓你成爲專家,我希望downvoting可以爲你的自我服務,但它不幫助其他人。而且它的上述鏈接沒有重複,這裏已經被其他人回答了 – Manoj

回答

1

重要區別在於,在MS

SELECT @inputData = column_name FROM table; 

運行行即使沒有謂詞即具有multirows結果集,在從任意行返回的column_name值。在Oracle

如果結果集包含超過一行
SELECT column_name INTO input_data FROM my_table; 

將失敗。 你不應該只是不經意地翻譯語法。

+0

我只是想了解我已經發現,在SQL Server中它服務於從單行中獲取列值的目的。謝謝它符合我的目的。 – Manoj

+0

謝謝你爲我服務,幫助它解決我的問題。但我不知道爲什麼我得到downvoted爲真正的問題 – Manoj

+0

我提交,即使查詢可能運行在多個行SQL服務器,事實上,你不能確定哪一行將提供的價值woudl足夠的結構將不適合對於任何查詢我已經完成的數據庫, – HLGEM

1

變量=列名

列的值賦予您的變量。

像這樣的東西應該在甲骨文工作:

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

謝謝我已經翻譯過了。 – Manoj

1

你的問題問

是什麼DECLARE variable = column_name辦?

聲明:DECLARE @Variable int = 5將創建一個名爲@Variable變量並初始化其內容的價值5

如果您的問題反而是:「這是什麼SELECT @inputData = column_name FROM table做」,那麼答案是,它賦予返回column_name到變量@inputData值。

我希望這能回答你的問題。 MS SQL和Oracle之間