使用Postgres的COPY FROM命令时能否硬编码列值?
问题解答:COPY语句中为指定列设置硬编码值
不行,COPY 是SQL*Plus专属命令,它的语法只能从输入文件读取对应列的数据,没法直接给某列指定硬编码值。不过可以通过以下几种方式实现你的需求:
临时表中转法
- 先用
COPY把文件里的col2数据导入临时表:COPY temp_table(col2) FROM filename; - 在PL/SQL里把临时表的数据插入目标表,同时带上col1的硬编码值:
DECLARE v_col1 VARCHAR2(100) := 'PL/SQL中获取到的值'; BEGIN INSERT INTO table_name(col1, col2) SELECT v_col1, col2 FROM temp_table; COMMIT; END; /
- 先用
预处理输入文件
在PL/SQL里先读取原文件,给每行拼接上col1的值和对应的分隔符(比如逗号),生成新文件,再用COPY导入目标表:COPY table_name(col1, col2) FROM new_filename;用UTL_FILE直接读取插入(推荐)
放弃COPY命令,直接在PL/SQL里用UTL_FILE读取文件内容,逐行插入目标表,每行都带上col1的硬编码值:DECLARE v_file_handle UTL_FILE.FILE_TYPE; v_col2_value VARCHAR2(2000); v_col1_value VARCHAR2(100) := 'PL/SQL中获取到的值'; -- 替换为实际值 BEGIN -- 打开文件,注意要先给用户授予UTL_FILE权限,指定对应的目录对象 v_file_handle := UTL_FILE.FOPEN('YOUR_DIR_OBJECT', 'filename', 'R'); LOOP BEGIN -- 读取一行数据到v_col2_value UTL_FILE.GET_LINE(v_file_handle, v_col2_value); -- 插入目标表 INSERT INTO table_name(col1, col2) VALUES(v_col1_value, v_col2_value); EXCEPTION WHEN NO_DATA_FOUND THEN -- 读取到文件末尾,退出循环 EXIT; END; END LOOP; UTL_FILE.FCLOSE(v_file_handle); COMMIT; EXCEPTION WHEN OTHERS THEN -- 异常时确保文件关闭 IF UTL_FILE.IS_OPEN(v_file_handle) THEN UTL_FILE.FCLOSE(v_file_handle); END IF; RAISE; END; /
内容的提问来源于stack exchange,提问作者John O
相关产品推荐
相关产品推荐

