任何人都知道如何编写 oracle 存储过程数据表作为输入参数。
问问题
1455 次
3 回答
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 回答
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 参数构建过程,其中应用程序将传递与字段和行分隔符连接的所有数据表记录。该过程必须以两种方式将其拆分并形成更好的结构,例如由 varchar2 表形成的记录表。
于 2012-10-06T13:11:24.013 回答
0
下面是一个将一行从复制到的EMPLOYEES
示例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 回答