Как разделить Oracle SQL операторов для ADO.NET - PullRequest
6 голосов
/ 21 ноября 2008

Как правильно разделить операторы SQL для отправки клиенту Oracle ADO.NET? Например, допустим, у вас есть следующий код в текстовом файле и вы хотите выполнить эти операторы:

CREATE TABLE foo (bar VARCHAR2(100));
INSERT INTO foo (bar) VALUES('one');
INSERT INTO foo (bar) VALUES('two');

Я полагаю, что попытка отправить всех в одной Команде заставит Oracle жаловаться на ";". Моей первой мыслью было бы разделиться на ";" персонажа, и отправляйте их по одному.

Но хранимые процедуры также могут содержать точки с запятой, так как бы мне сделать так, чтобы подпрограмма split сохраняла весь хранимый процесс вместе? Нужно ли искать операторы начала / конца или "/"?

Есть ли какая-либо разница в этом отношении между ODP.NET и провайдером Oracle Micrsoft?

Ответы [ 3 ]

5 голосов
/ 21 ноября 2008

Без DDL вы могли бы создать анонимный блок PL / SQL, окружив операторы BEGIN и END:

BEGIN
  INSERT INTO foo (bar) VALUES('one');
  INSERT INTO foo (bar) VALUES('two');
END;

Для выполнения DDL (например, CREATE TABLE) вам необходимо использовать динамический PL / SQL:

BEGIN
  EXECUTE IMMEDIATE 'CREATE TABLE foo (bar VARCHAR2(100))';
  EXECUTE IMMEDIATE 'INSERT INTO foo (bar) VALUES(:v)' USING 'one';
  EXECUTE IMMEDIATE 'INSERT INTO foo (bar) VALUES(:v)' USING 'two';
END;

INSERTS также являются динамическими, так как таблица не существует до запуска блока и поэтому не сможет скомпилироваться.

ПРИМЕЧАНИЕ. Это было бы необычным требованием: приложения обычно не должны создавать таблицы!

1 голос
/ 21 июля 2010

Компания под названием devart ( www.devart.com ) публикует библиотеку под названием dotConnect для Oracle .

Эта библиотека содержит класс с именем OracleScript , который может разделять сценарий SQL, содержащий несколько операторов.

0 голосов
/ 28 января 2011

Чтобы расширить ответ Тони, вы можете использовать анонимный блок для этого, вам просто нужно убедиться, что строка работает так, как вы ожидаете. Это пример DOWN AND DIRTY, в значительной степени разбитый на; и создание блока.

using System;
using System.Data;
using System.Text;
using System.Reflection;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;

namespace ODPSample
{
    class Class1
    {

        private static string formatAnonBlock(string userData)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("Begin ");
            string[] statements = userData.Split(';');
            foreach (string s in statements)
            {
                if (s.Length > 0)
                {
                    sb.AppendFormat(" EXECUTE IMMEDIATE '{0}';", s.Replace("'", "''"));
                }
            }
            sb.Append(" END ; ");
            return sb.ToString();
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Demo: Anon Block");

            // Connect
            string connectStr = "User Id=scott;Password=tiger;Data Source=database";

            string userInputtedSQL;
            userInputtedSQL = "Create table ABC(val varchar2(50)); insert into ABC values('123');insert into ABC values('567');";

            string anonBlock;
            anonBlock = formatAnonBlock(userInputtedSQL);
            Console.WriteLine(anonBlock);

            OracleConnection connection = new OracleConnection(connectStr);
            OracleCommand cmd = new OracleCommand(anonBlock, connection);


            try
            {
                connection.Open();
                cmd.ExecuteNonQuery();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }

            Console.WriteLine("Done");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...