【问题标题】:Oracle PL SQL procedure that is equivalent to T SQL in Sequel / SybaseOracle PL SQL 过程相当于 Sequel / Sybase 中的 T SQL
【发布时间】:2014-06-14 17:04:25
【问题描述】:

我是 Oracle 的新手。来自 SQL / Sybase 背景并努力创建一个应该从表中输出一组字段的过程。 我希望在 Oracle 中创建一个在 SQL/Sybase 上等效的存储过程,如下所示;

CREATE PROCEDURE ListTransactions @StartDate datetime, @EndDate datetime AS
DECLARE @ReportDate datetime
SET @ReportDate = CONVERT(datetime,CONVERT(VARCHAR,GETDATE(), 103), 103)
SELECT
   @ReportDate,
   trn.TransactionDate,
   cp.CounterPartyName,
   cu.Currency_Name,
   trn.Amount,
   trn.PostedBy,
   trn.Comments
FROM
   Transactions trn
   LEFT JOIN CounterParties cp ON trn.CounterParty_Id = cp.CounterParty_Id
   LEFT JOIN Currency cu ON trn.Currency_Id = cu.Currency_Id
WHERE
   trn.TransactionDate Between @StartDate AND @EndDate

【问题讨论】:

    标签: sql-server oracle stored-procedures plsql sybase


    【解决方案1】:

    以下应该做你想做的事情:

    CREATE OR REPLACE FUNCTION LIST_TRANSACTIONS(pStartDate IN DATE,
                                                 pEndDate   IN DATE)
      RETURN SYS_REFCURSOR IS
    DECLARE
      csr SYS_REFCURSOR;
    BEGIN
      OPEN csr FOR
        SELECT TRUNC(SYSDATE),
               trn.TransactionDate,
               cp.CounterPartyName,
               cu.Currency_Name,
               trn.Amount,
               trn.PostedBy,
               trn.Comments
          FROM Transactions trn
          LEFT OUTER JOIN CounterParties cp
            ON trn.CounterParty_Id = cp.CounterParty_Id
          LEFT OUTER JOIN Currency cu
            ON trn.Currency_Id = cu.Currency_Id
          WHERE trn.TransactionDate BETWEEN pStartDate
                                        AND pEndDate;
      RETURN csr;
    END LIST_TRANSACTIONS;
    

    我不明白您所说的“从表中输出一组字段”是什么意思。此函数将返回调用者随后可以迭代的游标。例如,如果您想将游标的结果转储到 DBMS_OUTPUT,您可以执行以下匿名块之类的操作:

    DECLARE
      c                    SYS_REFCURSOR;
      dtDate               DATE;
      dtTransaction_date   DATE;
      strCounterPartyName  VARCHAR2(100);
      strCurrency_Name     VARCHAR2(100);
      nAmount              NUMBER;
      strPostedBy          VARCHAR2(100);
      strComments          VARCHAR2(2000);
    BEGIN
      c := LIST_TRANSACTIONS(pStartDate => SYSDATE - INTERVAL '1' MONTH,
                             pEndDate   => SYSDATE);
    
      LOOP
        FETCH c
          INTO dtDate,
               dtTransaction_date,
               strCounterPartyName,
               strCurrency_Name,
               nAmount,
               strPostedBy,
               strComments;
    
        EXIT WHEN c%NOTFOUND;
    
        DBMS_OUTPUT.PUT_LINE('Date=' || dtDate || 
                             'Transaction date=' || dtTransaction_date ||
                             'Counter-party namme=' || strCounterPartyName ||
                             'Currency name=' || strCurrency_Name ||
                             'Amount=' || nAmount ||
                             'Posted by=' || strPostedBy ||
                             'Comments=' || strComments);
      END LOOP;
    
      CLOSE c;
    END;
    

    未在动物身上进行测试 - 你会是第一个!

    分享和享受。

    【讨论】:

    • 仅供参考,带有@ReportDate 的有趣的双重 CONVERT 是 T-SQL 等效于 Oracle 的 TRUNC 语句。它将时间部分设置为全零 - 即午夜。虽然我更喜欢DateAdd( d, 0, DateDiff( d, 0, getdate()) ),它使用严格的算术函数而不是文本格式化/解析来做同样的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 2012-08-06
    • 1970-01-01
    相关资源
    最近更新 更多