0

Oracleストアドプロシージャデータテーブルを入力パラメータとして書き込む方法は誰でも知っています。

4

3 に答える 3

0

このような場合、データベース一時テーブルを使用するのが非常に一般的です。つまり、データテーブルレコードをテーブルに挿入し、接続を閉じずにプロシージャを呼び出して、一時データを確認して処理できるようにします。

擬似コードは次のようになります。

//Get the data you want to process
DataTable data = GetData();

//Create new Connection
Connection conn = Connection.CreateNew();

//Open the connection
conn.Open()

//Insert the data on a temporary table using the open connection
InsertDataIntoTemporaryTable(conn, data);

//Call the procedure to process the data using the same open connection
CallProcedureToProcessData(conn);

//Finish by ending the connection (everything done in the procedure will be commited)
conn.Close();

別の実装可能なオプションは、アプリケーションがフィールドと行の区切り文字で連結されたすべてのデータテーブルレコードを渡すCLOBパラメーターを使用してプロシージャを構築することです。この手順では、2つの方法で分割し、varchar2のテーブルによって形成されるレコードのテーブルのように、より適切な構造を形成する必要があります。

于 2012-10-06T13:11:24.013 に答える
0

EMPLOYEES以下は、 からに1 行をコピーする例EMPLOYEES_COPYです。お役に立てば幸いです。

DROP TABLE EMPLOYEES;
/
DROP TABLE EMPLOYEES_COPY; 
/
CREATE TABLE EMPLOYEES
(
  ID INT,
  FIRST_NAME varchar(30),
  LAST_NAME varchar(30)
);

insert into EMPLOYEES values(1,'AA','BBB');
insert into EMPLOYEES values(2,'CC','GGG');
insert into EMPLOYEES values(3,'EEE','MMM');
insert into EMPLOYEES values(4,'FFF','ZZZ');
/
CREATE TABLE EMPLOYEES_COPY 
(
  ID INT,
  FIRST_NAME varchar(30),
  LAST_NAME varchar(30)
);
/
CREATE OR REPLACE PACKAGE EMPLOYEE as 
type t_cursor is ref cursor;
procedure GETALL(curEMPLOYEE out t_cursor);
procedure INSERT_COPY;
end EMPLOYEE;
/
CREATE OR REPLACE PACKAGE BODY EMPLOYEE as
  ---------------------------------------------
 procedure GETALL(curEMPLOYEE out t_cursor) as
   begin
      open curEMPLOYEE  for SELECT id, FIRST_NAME, LAST_NAME
                           FROM   EMPLOYEES;    
   end GETALL;
 ---------------------------------------------
 procedure INSERT_COPY as
   cur t_cursor;
   emp employees%rowtype;
   begin
      GETALL(curEMPLOYEE=>cur);
        LOOP
    FETCH cur INTO emp;
       EXIT WHEN cur%NOTFOUND;
       insert into EMPLOYEES_COPY
       values(emp.id,emp.FIRST_NAME,emp.LAST_NAME);
   END LOOP;
   end INSERT_COPY;   
end EMPLOYEE;
/

パッケージは、単一のエンティティの機能をグループ化できるため、非常に便利です。例では、従業員に取り組んでいる関数をグループ化しました。

以下を使用して例をテストできます。

BEGIN      
  EMPLOYEE.INSERT_COPY;  
  commit;      
END;

詳細情報

ここに同様の問題があります。

于 2012-10-06T13:48:05.457 に答える
0

パラメータを として渡し、varchar2クエリ文字列を作成して、EXECUTE IMMEDIATEまたは カーソルとして実行します。その他の例はこちら

アップデート。例:

create table temp11(id int not null);
/
create or replace
procedure test_proc(table_name varchar2)
as
  query_str varchar2(200);
  begin
  query_str := 'INSERT INTO '||table_name||'(id) values (2)';
  EXECUTE IMMEDIATE query_str ;

end;
/
exec test_proc('temp11');
commit;
于 2012-10-06T12:39:21.557 に答える