plsql复制表数据

这段PL/SQL代码展示了如何使用游标从EMS_CUSTOMS_BROKER和EMS_CUSTOMS_DETAIL表复制数据到MEMS_CUSTOMS_BROKER和MEMS_CUSTOMS_BROKER_ALIAS表。首先,它从ID_GENERATOR表获取新的ID,然后通过游标遍历源表,插入新记录,并更新ID_GENERATOR表以保持主键连续性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用游标

DECLARE
TYPE cur_type IS REF CURSOR;

mcb_c cur_type;
mcb_id NUMBER(10);
v_created_time DATE;
v_created_by VARCHAR2(30);
v_lastupdated_time DATE;
v_lastupdated_by VARCHAR2(30);
v_code VARCHAR2(10);
v_name VARCHAR2(60);
v_is_in_black_list VARCHAR2(2);

mcba_c cur_type;
mcba_id NUMBER(10);
v_a_created_time DATE;
v_a_created_by VARCHAR2(30);
v_a_code VARCHAR2(10);
v_a_name VARCHAR2(60);
v_broker_id NUMBER(10);

begin
       /*复制数据到CUSTOMS_BROKER*/
       /*应先在ID_GENERATOR表中新增ID KEY的记录*/
       SELECT ID_VALUE INTO mcb_id FROM ID_GENERATOR WHERE ID_KEY='CUSTOMS_BROKER_ID';
      
       OPEN mcb_c FOR SELECT CREATE_DATETIME, CREATE_BY_ACTOR, UPDATE_DATETIME, UPDATE_BY_ACTOR, CUSTOM_CODE, CUSTOMS_BROKER, BLACK_STATUS
       FROM EMS_CUSTOMS_BROKER WHERE CUSTOM_FLAG = 'C';
       LOOP
              FETCH mcb_c INTO v_created_time, v_created_by, v_lastupdated_time, v_lastupdated_by, v_code, v_name, v_is_in_black_list;
              EXIT WHEN mcb_c%NOTFOUND;

              /*重设CUSTOMS_BROKER主键*/
              mcb_id := mcb_id + 1;
              INSERT INTO MEMS_CUSTOMS_BROKER(ID, CODE, NAME, IS_IN_BLACK_LIST, OWED_PAYMENT_BILL_COUNT,
       CREATED_BY, CREATED_TIME, LASTUPDATED_BY, LASTUPDATED_TIME, VERSION)
              VALUES (mcb_id, v_code, v_name, CASE WHEN v_is_in_black_list = 'Y' THEN 1 ELSE 0 END, 0,
       v_created_by, CAST(v_created_time AS TIMESTAMP), v_lastupdated_by, CAST(v_lastupdated_time AS TIMESTAMP), 0);
                     
       END LOOP;
       CLOSE mcb_c;
       mcb_id := mcb_id + 5;
      
       UPDATE ID_GENERATOR SET ID_VALUE = mcb_id WHERE ID_KEY='CUSTOMS_BROKER_ID';
       COMMIT;


       /*复制数据到CUSTOMS_BROKER_ALIAS*/
       /*应先在ID_GENERATOR表中新增ID KEY的记录*/
       SELECT ID_VALUE INTO mcba_id FROM ID_GENERATOR WHERE ID_KEY='CUSTOMS_BROKER_ALIAS_ID';
      
       OPEN mcba_c FOR SELECT CREATE_DATETIME, CREATE_BY_ACTOR, CUSTOMS_BROKER, CUSTOM_CODE
       FROM EMS_CUSTOMS_DETAIL;
       LOOP
              FETCH mcba_c INTO v_a_created_time, v_a_created_by, v_a_name, v_a_code;
              EXIT WHEN mcba_c%NOTFOUND;

       select b.id into v_broker_id from MEMS_CUSTOMS_BROKER b where b.CODE = v_a_code;

              /*重设CUSTOMS_BROKER_ALIAS主键*/
              mcba_id := mcba_id + 1;
              INSERT INTO MEMS_CUSTOMS_BROKER_ALIAS(ID, BROKER_ALIAS, CUSTOMS_BROKER_ID,
       CREATED_BY, CREATED_TIME, VERSION)
              VALUES (mcba_id, v_a_name, v_broker_id,
       v_a_created_by, CAST(v_a_created_time AS TIMESTAMP), 0);
                     
       END LOOP;
       CLOSE mcba_c;
       mcba_id := mcba_id + 5;
      
       UPDATE ID_GENERATOR SET ID_VALUE = mcba_id WHERE ID_KEY='CUSTOMS_BROKER_ALIAS_ID';
       COMMIT;
end;

<think>好的,用户的问题是关于如何使用PL/SQL将数据导出为CSV、Excel或其他常见文件格式。我需要根据提供的引用内容来整理答案。首先,查看用户提供的三个引用: 引用1提到PL/SQL Developer可以导入或导出CSV文件。引用2说明可以通过复制粘贴的方式导出到Excel,并且提到PL/SQL Developer的功能。引用3指出虽然可以使用PL/Python导出CSV,但更推荐使用PostgreSQL的COPY TO命令,不过用户可能是在Oracle环境下。 用户的需求是使用PL/SQL导出数据到CSV、Excel等格式。需要覆盖的方法可能包括使用PL/SQL Developer工具、直接使用SQL*Plus的SPOOL命令、UTL_FILE包,以及可能的其他方法。 首先,整理PL/SQL Developer的方法,因为引用1和2都提到了这个工具。导出CSV可以通过工具中的导出功能,步骤可能包括右键,选择导出数据,然后选择CSV格式。对于Excel,引用2提到可以直接复制粘贴,这可能是一个快捷方式,但可能不适合大量数据。 然后,考虑使用Oracle自带的UTL_FILE包,允许PL/SQL代码将数据写入服务器端的文件,但需要目录权限。此外,SQL*Plus的SPOOL命令可以将查询结果导出到本地文件,适合命令行操作。 还需要注意不同方法的适用场景,比如UTL_FILE需要在服务器上有写入权限,而PL/SQL Developer是图形化工具,适合交互式操作。同时,引用3提到PostgreSQL的COPY命令,但用户可能使用的是Oracle,所以可能需要调整说明,指出Oracle中的类似方法,比如SPOOL或UTL_FILE。 生成相关问题的时候,需要围绕导出方法、权限处理、大数据量导出以及不同格式的比较来提问。 最后,确保回答结构清晰,分点列出每种方法,并给出步骤或示例代码,同时引用正确的来源。注意用户需要的是PL/SQL相关的方法,所以可能UTL_FILE和存储过程会是重点,同时提到工具的使用作为辅助方法。</think>### 分步说明:PL/SQL数据导出方法 #### 一、使用PL/SQL Developer工具 1. **导出CSV文件** - 右键点击目标 > 选择 **"Export Data"** > 在格式中选择 **CSV** - 指定文件路径后,自动生成带分隔符的文本文件[^1] 2. **导出Excel文件** - 执行查询后,在结果网格中全选数据 > 复制到剪贴板 - 直接粘贴到Excel工作(支持小于10万行的数据量)[^2] #### 二、使用SQL*Plus命令行 ```sql -- 设置输出格式 SET colsep ',' -- CSV分隔符 SET pagesize 0 -- 取消分页 SET feedback off -- 关闭执行信息 -- 导出到本地文件 SPOOL /path/to/output.csv SELECT * FROM employees; SPOOL OFF ``` #### 三、使用UTL_FILE包(需DBA权限) ```sql DECLARE fhandle UTL_FILE.FILE_TYPE; CURSOR emp_cur IS SELECT * FROM employees; BEGIN fhandle := UTL_FILE.FOPEN('DATA_DIR', 'employees.csv', 'w'); -- 需要预定义目录对象 FOR rec IN emp_cur LOOP UTL_FILE.PUT_LINE(fhandle, rec.emp_id || ',' || rec.name || ',' || TO_CHAR(rec.hire_date, 'YYYY-MM-DD')); END LOOP; UTL_FILE.FCLOSE(fhandle); END; ``` > 注意:需要预先创建目录对象 `CREATE DIRECTORY data_dir AS '/server/path'` #### 四、外部方式(大数据量推荐) ```sql CREATE TABLE ext_employees ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER DEFAULT DIRECTORY data_dir ACCESS PARAMETERS ( RECORDS DELIMITED BY NEWLINE FIELDS TERMINATED BY ',' ) LOCATION ('employees.csv') ) AS SELECT * FROM employees; ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值