Внутреннее объединение двух табличных переменных и возвращение выходного курсора из анонимного блока plsql в приложении ac # - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть такой сценарий:

  • Мне нужно вставить результат многих объединений (15 таблиц с различными фильтрами) в переменную таблицы var_TB_PROJECT
  • Затем вставить результатиз множества других объединений (8 таблиц с различными фильтрами) в другую табличную переменную var_TB_CAMERAS
  • Наконец, внутреннее объединение этих двух табличных переменных

Все это внутри анонимного блока plsql, посколькуЯ не могу создать какие-либо объекты в исходной базе данных (без привилегий).

Этот анонимный блок plsql будет выполнен внутри приложения C #, которое вернет выходной курсор в качестве примера кода ниже.

Возможно ли это сделать?

static void TestBlock()
{
        string conString = ConfigManager.GetConnectionStringByName("CI_L3"); 
        OracleConnection con = new OracleConnection();
        con.ConnectionString = conString;
        con.Open();

        string cmdtxt = @"
                    DECLARE
                      type rectyp is record(TABLE1.FIELD1%TYPE, TABLE2.FIELD1%TYPE, TABLE3.FIELD1%TYPE, ... many fields ....  );
                      type tpTbl is table of rectyp;
                      var_TB_PROJETO tpTbl;
                      var_TB_CAMERAS tpTbl;

                    BEGIN

                     -- load var_TB_PROJETO
                      select FIELD1, FIEL2, FIELN .... bulk collect into var_TB_PROJETO
                      from TABLE1 INNER JOIN TABLE2 ON TABLE1.ID = TABLE2.FID
                      INNER JOIN TABLE3 ON TABLE2.ID = TABLE3.FID .... 
                        .
                        .
                        -- many tables ...
                        .
                        .

                     -- load var_TB_CAMERAS
                      select FIELD1, FIEL2, FIELN .... bulk collect into var_TB_CAMERAS
                      from TABLE1 INNER JOIN TABLE2 ON TABLE1.ID = TABLE2.FID
                      INNER JOIN TABLE3 ON TABLE2.ID = TABLE3.FID .... 
                        .
                        .
                        -- many tables ...
                        .
                        .

                      OPEN :1 for SELECT * FROM var_TB_PROJETO INNER JOIN var_TB_CAMERAS 
                            ON var_TB_PROJETO.ID = var_TB_CAMERAS.ID;

                END;";

        OracleCommand cmd = con.CreateCommand();
        cmd.CommandText = cmdtxt;
        OracleParameter p1 = cmd.Parameters.Add("refcursor1", OracleDbType.RefCursor);  
        p1.Direction = ParameterDirection.Output;

        cmd.ExecuteNonQuery();

        OracleDataReader dr1 = ((OracleRefCursor)cmd.Parameters[0].Value).GetDataReader();

        while (dr1.Read()) {
            var st1 = dr1.GetString(0);
        }
}

1 Ответ

0 голосов
/ 14 декабря 2018

@ Goldar: зачем использовать анонимный блок PL / SQL, когда он может быть решен как оператор SQL

 WITH TB_PROJETO as (
  select TABLE1.ID, FIELD1, FIEL2, FIELN
  from TABLE1 INNER JOIN TABLE2 ON TABLE1.ID = TABLE2.FID
  INNER JOIN TABLE3 ON TABLE2.ID = TABLE3.FID .... 
    .
    .
    -- many tables ...
    .
    .
), TB_CAMERAS as (
  select TABLE1.ID, FIELD1, FIEL2, FIELN 
  from TABLE1 INNER JOIN TABLE2 ON TABLE1.ID = TABLE2.FID
  INNER JOIN TABLE3 ON TABLE2.ID = TABLE3.FID .... 
    .
    .
    -- many tables ...
    .
    .
)
SELECT *
FROM TB_PROJETO
INNER JOIN TB_CAMERAS ON TB_PROJETO.ID = TB_CAMERAS.ID;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...