2011-05-14 6 views
2

before하지만이 솔루션은 저와 함께 작동하지 않는 것 같습니다. 나는 현재이 할 노력하고있어C#/.Net의 "on the fly"저장 프로 시저를 생성하고 컴파일하십시오.

:

  1. 오라클
  2. 기업 라이브러리 5.0을 사용하여 SQL 명령을 만들기위한 "CREATE PROCEDURE에"스크립트 문자열을 구축하고 매개 변수로이 문자열을 전달
  3. 되세요 오라클 데이터베이스에 저장된 프로 시저

그래서 지금까지 포인트 # 3 SQL 개발자를 열고 프로 시저 트리 목록을 확장하면 다음 절차를 볼 수 있습니다 bu t는 적색 십자가 원으로 표시됩니다. 이는 컴파일러 오류가 있음을 의미합니다. SQL Developer 쿼리 창에서 이와 동일한 코드를 실행하면 문제가 없으며 컴파일됩니다. SQL Developer에서는 "CREATE PROCEDURE"스크립트를 실행해도 아무런 오류가 발생하지 않기 때문에 프로 시저를보고 실행할 수는 있지만 C#에서는 수행하지 않기 때문에 확실하지 않습니다.

IDBCommand.Prepare()을 호출해야한다는 내용의 초반에 게시 된 링크를 읽었지 만 SQLCommand.CommandType이 StoredProcedure 유형이고 실제로 프로 시저를 호출하지 않고 순수 SQL을 실행하는 경우에만 해당 메서드가 관련이 있습니다 그럼에도 불구하고 테스트를 위해서 StoredProcedure에 할당 한 새 명령을 만든 다음 그 명령에서 Prepare() 메서드를 호출하여 마지막으로 ExecuteNonQuery() 메서드를 호출하는 새 메서드를 만들었습니다. 컴파일되지 않았기 때문에 사용할 수없는 객체 (저장 프로 시저)는 예외입니다 ...

사실, 프로 시저를 만들고 C#에서 컴파일 할 수있는 방법을 알고있는 사람이 있는지 궁금합니다. 까맣다 하지만 엔터 프라이즈 라이브러리를 사용하는 것만으로도 오라클 제공자에게 직접 "하드 코딩"하는 것은 괜찮습니다.

Btw, 코드에서 프로 시저를 만드는 것이 나쁜 습관이라고 나는 말하기 전에 불행히도 이것은 고객의 프로젝트이며 우리는 제작에 대한 결정을하지 않았으며 실제로 SQL Server에서 마이그레이션하려고합니다. 오라클에

+0

글쎄, 캐리지 리턴 데 문자 (CR) 또는 줄 바꿈, CREATE PROCEDURE 명령 문자열이이 문제가 발생합니다, 그래서, 어떻게 든이 Oracle에 의해 해석되고 잘못 된 이유는 누가 알겠습니까. 어쨌든 mySqlStr.Replace (System.Environment.NewLine, string.Empty)를 수행하여 "다소"해결했습니다. 그런 식으로 명령은 10g Express에서 올바르게 구문 분석되는 단일 행으로 이동합니다. –

답변

2

나는 약간 녹슬었고 지금은 오라클 액세스 권한이 없습니다. 그러나 나는 당신이 요구하는 것을 알고 있다고 생각합니다. ADO.NET OracleCommand 클래스와 Oracle EXECUTE IMMEDIATE 문을 사용하려고합니다. 다음과 같은 내용 :

 OracleConnection conn = new OracleConnection("Data Source=something; user id=something; Password=something;"); 
     conn.Open(); 
     OracleCommand command = new OracleCommand(); 
     command.CommandType = CommandType.Text; 
     command.CommandText = "execute immediate 'create or replace procedure [...you know this part...]' "; 
     command.Connection = conn; 
     command.ExecuteNonQuery(); 
     conn.Close(); 
    } 

그래야합니다. 그러나 스톡 ADO.NET 대신 항상 ODP.NET (오라클 자체 데이터 제공 업체)을 사용 했으므로 주식 라이브러리를 사용하는 경우 약간의 차이가있을 수 있습니다.

Pete는 동적 SQL을 사용하여 동일한 효과를 얻을 수 있다고 제안했습니다.전체 CREATE PROCEDURE 문을 매개 변수로 전달하여 기존 저장 프로 시저에 EXECUTE IMMEDIATE를 호출합니다. 그러나 나는 당신이 해야한다고 믿지 않습니다. 위의 내용은 최소한으로 유지하려는 경우 작동합니다.

다른 하나. 나는 이런 일이 될 이유를 알고 있지만, 오라클은 당신에게 절차를 말하는 경우 것은 당신이 그것을 잘 알고있다하더라도 유효하지 않습니다 실행하려고

EXECUTE IMMEDIATE ALTER PROCEDURE schemaname.procedurename COMPILE; 

나는 종종 관해서는 조금 허약로 오라클을 발견했습니다 불필요하게 오브젝트를 무효로하는 것.

+0

"EXECUTE IMMEDIATE CREATE OR REPLACE ..."가 작동하지 않습니다. 오라클 자체 공급자 DLL ODAC –

+0

죄송합니다. 실행중인 명령을 작은 따옴표로 묶어야합니다. 결정된. –

1

SQL Server 또는 Oracle에서 DDL 문을 동적으로 실행하려면 C#에서 작성한 DDL을 Oracle의 프로 시저에 전달한 다음 EXECUTE IMMEDIATE를 사용하여 문자열을 명령으로 실행하고 절차.

This page에서 "정적 SQL 프로그램에서 지원되지 않는 DDL 문과 다른 SQL 문을 실행하려는 경우"동적 SQL을 사용해야한다고 언급합니다.

이 정보가 도움이되기를 바랍니다.

+0

이것이 올바른 대답이라고 생각합니다. 허용 된 대답이 나를 위해 작동하지 않습니다. ODP.NET을 사용하여 저장 프로 시저를 만들 수 없습니다. Pete가 제안하는 +1이 아닌 한. – shev72

0

마지막 문자는 무엇입니까?

오라클의 원본 SQL * Plus는 슬래시 문자를 사용하여 현재 명령을 실행합니다. 많은 IDE가 동일한 것을 사용하거나 슬래시를 프로 시저/패키지의 일부가 아닌 것으로 해석합니다.

따라서 'CREATE ...'문자열의 끝에 슬래시 (새 행에)가 있으면, 그러면 오류가 발생합니다. 그러나 IDE에 의해로드되어 다시 컴파일 된 경우 IDE에서 제거 할 수 있습니다.

C#으로로드 한 후 USER_ERRORS 검사를 수행하고 해당 프로그램 단위에 잘못된 것으로보고되는지 확인하십시오.

+0

끝에 슬래시 문자가 없습니다. –

관련 문제