0

我不确定如何编写 Oracle 的存储过程。这对我来说有点新鲜。

Table 1:  Bank:

Bank_Id    Description
001        FNB
002        ABSA

Table 2:  Config

Config    ConfigName
1         SUTS allocated
2         SUTS unallocated
3         GOV allocated
4         GOV unallocated

Table 3: Config_Value

Config_Value_Id      Bank_Id    Config_Item_Id  ConfigValue
1                    001         1              FNBSAD
2                    001         2              FNBSUAD
3                    001         3              FNBGAD
4                    001         4              FNBGUAD

Config_Value 是 Config 和 Bank 表之间的关系。

当我在 C# 中编写代码来设置两个值时:

  • 字符串银行=“FNB”
  • 字符串 paymentType = "SUTS"

然后这些值将传递给存储过程。我想在存储过程中编写 IF 或 SWITCH 语句,例如:

IF (@PaymentType == 'SUTS')
need to get two values:
  ConfigValue = @param1 where ConfigName = 'SUTS allocated' AND where bank = @bank
  ConfigValue = @param2 where ConfigName = 'SUTS unallocated' AND where bank = @bank

IF (@PaymentType == 'GOV')
need to get two values:
  ConfigValue = @param1 where ConfigName = 'GOVallocated' AND where bank = @bank
  ConfigValue = @param2 where ConfigName = 'GOV unallocated' AND where bank = @bank

将值(银行和 paymentType)传递给存储过程后,根据银行和 paymentType 获取 ConfigValue 的两个值。如何在上面的存储过程中编写?你能给我示例代码吗?非常感谢!

4

2 回答 2

1
CREATE TABLE Bank
(
    Bank_Id     VARCHAR2(30)
,   Description VARCHAR2(30)
);

INSERT INTO Bank VALUES('001', 'FNB');
INSERT INTO Bank VALUES('002', 'ABSA');

CREATE TABLE Config
(
    Config      NUMBER
,   ConfigName  VARCHAR2(30)
);

INSERT INTO Config VALUES(1, 'SUTS allocated');
INSERT INTO Config VALUES(2, 'SUTS unallocated');
INSERT INTO Config VALUES(3, 'GOV allocated');
INSERT INTO Config VALUES(4, 'GOV unallocated');

CREATE TABLE Config_Value
(
    Config_Value_Id NUMBER
,   Bank_Id         VARCHAR2(30)
,   Config_Item_Id  NUMBER
,   ConfigValue     VARCHAR2(30)
);

INSERT INTO Config_Value VALUES(1, '001', 1, 'FNBSAD');
INSERT INTO Config_Value VALUES(2, '001', 2, 'FNBSUAD');
INSERT INTO Config_Value VALUES(3, '001', 3, 'FNBGAD');
INSERT INTO Config_Value VALUES(4, '001', 4, 'FNBGUAD');

SELECT * FROM Bank;
1   FNB
2   ABSA

SELECT * FROM Config;
1   SUTS allocated
2   SUTS unallocated
3   GOV allocated
4   GOV unallocated

SELECT * FROM Config_Value;
1   001 1   FNBSAD
2   001 2   FNBSUAD
3   001 3   FNBGAD
4   001 4   FNBGUAD

SELECT  *
FROM    Bank         b
JOIN    Config_Value cv ON b.Bank_Id         = cv.Bank_Id
JOIN    Config       c  ON cv.Config_Item_Id = c.Config
;

SELECT  cv.ConfigValue
FROM    Bank         b
JOIN    Config_Value cv ON b.Bank_Id         = cv.Bank_Id
JOIN    Config       c  ON cv.Config_Item_Id = c.Config
WHERE   ConfigName IN ('SUTS allocated', 'SUTS unallocated')
;

SELECT  cv.ConfigValue
FROM    Bank         b
JOIN    Config_Value cv ON b.Bank_Id         = cv.Bank_Id
JOIN    Config       c  ON cv.Config_Item_Id = c.Config
WHERE   ConfigName IN ('GOV allocated', 'GOV unallocated')
;

CREATE OR REPLACE FUNCTION c_sharp_function(bank_in IN VARCHAR2, paymentType_in 
VARCHAR2)
RETURN VARCHAR2
AS
    TYPE ConfigValue_ntt IS TABLE OF Config_Value.ConfigValue%TYPE;
    l_ConfigValue  ConfigValue_ntt;
    l_csv          VARCHAR(32767) := '';
BEGIN
    IF UPPER(paymentType_in) LIKE 'SUTS%' THEN
        SELECT  cv.ConfigValue
        BULK    COLLECT INTO l_ConfigValue
        FROM    Bank         b
        JOIN    Config_Value cv ON b.Bank_Id         = cv.Bank_Id
        JOIN    Config       c  ON cv.Config_Item_Id = c.Config
        WHERE   ConfigName IN ('SUTS allocated', 'SUTS unallocated')
        AND     Description  = bank_in;
    ELSIF UPPER(paymentType_in) LIKE 'GOV%' THEN
        SELECT  cv.ConfigValue
        BULK    COLLECT INTO l_ConfigValue
        FROM    Bank         b
        JOIN    Config_Value cv ON b.Bank_Id         = cv.Bank_Id
        JOIN    Config       c  ON cv.Config_Item_Id = c.Config
        WHERE   ConfigName IN ('GOV allocated', 'GOV unallocated')
        AND     Description  = bank_in;
    END IF;

    FOR indx IN 1..l_ConfigValue.COUNT LOOP
        l_csv := l_csv || l_ConfigValue(indx) || ',';
    END LOOP;

    l_csv := SUBSTR(l_csv, 1, LENGTH(l_csv) - 1);

    RETURN l_csv;
END;

DECLARE
    l_get_csv VARCHAR2(32767);
BEGIN
    l_get_csv := c_sharp_function('FNB', 'SUTS');
    DBMS_OUTPUT.PUT_LINE(l_get_csv);

    l_get_csv := c_sharp_function('ABSA', 'GOV');
    DBMS_OUTPUT.PUT_LINE(l_get_csv);
END;
/*
FNBSAD,FNBSUAD

FNBSAD,FNBSUAD
*/
于 2013-06-07T15:33:25.007 回答
0

执行此操作的过程需要两个输入参数 (PaymentTypebank) 和两个输出参数 (param1param2)。

请注意,与 SQL Server 和 MySQL 不同,Oracle 参数以冒号 ( :) 而不是“at”符号 ( @) 开头,因此在 C# 代码中您需要将它们命名为:PaymentType:bank:param1:param2

另请注意,当您编写 C# 代码时,您必须完全按照它们在 Oracle 中的名称命名参数(前面的冒号除外)。如果不这样做,C# 代码将编译得很好,但它会在运行时失败。如果您的第一个参数PaymentType在 Oracle 中,则应该:PaymentType在 C# 中调用它。

还有一点需要注意:我不确定你的ConfigConfig_Value表是如何相关的。根据测试数据,它可能是通过Config_Value.Config_Value_IdConfig_Value.Config_Item_Id。我去了Config_Item_Id

Oracle 过程将如下所示:

CREATE OR REPLACE PROCEDURE myProc(
   PaymentType VARCHAR,
   bank VARCHAR,
   param1 OUT VARCHAR,
   param2 OUT VARCHAR)
AS
BEGIN
  IF PaymentType = 'SUTS' THEN
    SELECT ConfigValue INTO param1
      FROM Config_Value
      INNER JOIN Bank ON Config_Value.Bank_ID = Bank.Bank_ID
      INNER JOIN Config ON Config_Value.Config_Item_Id = Config.Config
      WHERE Bank.Description = bank
        AND Config.ConfigName = 'SUTS allocated';
    -- Now for param2; the only difference is the first line (INTO param2)
    -- and the last line (ConfigName = 'SUTS unallocated').
    SELECT ConfigValue INTO param2
      FROM Config_Value
      INNER JOIN Bank ON Config_Value.Bank_ID = Bank.Bank_ID
      INNER JOIN Config ON Config_Value.Config_Item_Id = Config.Config
      WHERE Bank.Description = bank
        AND Config.ConfigName = 'SUTS unallocated';
  ELSE
    -- Do the same as above, but for 'GOV' instead of 'SUTS'.
  END IF;
END myProc;
/

如果您的所有选项都是“付款类型”加上“已分配”或“未分配”,您可以通过构建“*已分配”和“*未分配”值来取消“如果”逻辑:

CREATE OR REPLACE PROCEDURE myProc(
   PaymentType VARCHAR,
   bank VARCHAR,
   param1 OUT VARCHAR,
   param2 OUT VARCHAR)
AS
BEGIN
  -- param1
  SELECT ConfigValue INTO param1
    FROM Config_Value
    INNER JOIN Bank ON Config_Value.Bank_ID = Bank.Bank_ID
    INNER JOIN Config ON Config_Value.Config_Item_Id = Config.Config
    WHERE Bank.Description = bank
      AND Config.ConfigName = PaymentType || ' allocated';
  -- param2
  SELECT ConfigValue INTO param2
    FROM Config_Value
    INNER JOIN Bank ON Config_Value.Bank_ID = Bank.Bank_ID
    INNER JOIN Config ON Config_Value.Config_Item_Id = Config.Config
    WHERE Bank.Description = bank
      AND Config.ConfigName = PaymentType || ' unallocated';
END;
/

我还没有测试过这个,但它至少应该很接近。我希望这足以让你开始。

如果您收到消息“过程已创建”,则语法正常,是时候测试过程了。如果您收到消息“过程创建时出错”,show errors请在 SQLPlus 提示符处键入以查看错误列表。

于 2013-06-07T14:42:06.520 回答