2008-11-21 37 views
6

Cách thích hợp để phân tách các câu lệnh SQL để gửi tới một máy khách ADO.NET của Oracle là gì? Ví dụ, cho phép nói rằng bạn có đoạn mã sau vào một tập tin văn bản và muốn thực hiện các báo cáo:Cách tách các câu lệnh sql Oracle cho ADO.NET

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

Tôi tin rằng cố gắng để gửi tất cả những người trong một lệnh sẽ gây Oracle để khiếu nại về việc ";". Suy nghĩ đầu tiên của tôi là chia nhỏ ";" và gửi từng cái một.

Tuy nhiên, các thủ tục được lưu trữ cũng có thể chứa dấu chấm phẩy, vì vậy làm cách nào để tôi thực hiện quy trình chia nhỏ để giữ toàn bộ lưu trữ được cùng nhau? Liệu nó cũng cần tìm kiếm các câu lệnh bắt đầu/kết thúc hay "/"?

Có sự khác biệt nào về các khía cạnh này giữa ODP.NET và Nhà cung cấp Oracle Micrsoft không?

Trả lời

5

Nếu không có sự DDL, bạn có thể tạo ra một khối PL/SQL nặc danh bởi xung quanh những điều khoản với BEGIN và END:

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

Thực hiện DDL (như CREATE TABLE), bạn sẽ cần phải sử dụng động 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 cũng là động, vì bảng không tồn tại trước khi chạy khối và do đó sẽ không biên dịch được.

LƯU Ý: Đây sẽ là một yêu cầu bất thường: các ứng dụng thường không nên tạo bảng!

+0

Tôi đang cố gắng thực thi SQL đã nhập của người dùng về cơ bản và yêu cầu ứng dụng chia nhỏ chính xác để gửi cho ứng dụng khách ADO.NET. –

+1

Hmm - Tôi không muốn hỗ trợ SQL do người dùng nhập! Có thể cũng chỉ cung cấp cho họ quyền truy cập vào SQL Plus? –

1

Công ty được gọi là devart (www.devart.com) xuất bản thư viện có tên dotConnect for Oracle.

Thư viện này chứa một lớp được gọi là OracleScript có khả năng tách tập lệnh SQL chứa nhiều câu lệnh.

0

Để mở rộng câu trả lời của Tony, bạn có thể sử dụng khối Ẩn danh để thực hiện việc này, bạn sẽ phải đảm bảo chuỗi hoạt động như mong đợi. Đây là một ví dụ DOWN AND DIRTY, chia nhỏ khá nhiều trên; và tạo khối.

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"); 
     } 
    } 
} 
Các vấn đề liên quan