AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 274535
Accepted
ellie-lumen
ellie-lumen
Asked: 2020-08-29 02:17:24 +0800 CST2020-08-29 02:17:24 +0800 CST 2020-08-29 02:17:24 +0800 CST

ORA-06502: 写入 csv 时出现“字符串缓冲区太小”

  • 772

我有一些要导出的表。我正在使用这个包(我称之为“CSV”):https ://www.williamrobertson.net/documents/refcursor-to-csv.shtml

在添加 CASE 语句之前,我能够写入 CSV 文件。我真的希望有办法解决它,因为我的 CASE 语句非常有用。

错误是:

ORA-06502: PL/SQL: numeric or value error: character string buffer too small

ORA-06512: at "SYS.DBMS_SQL", line 2084

ORA-06512: at "C##USER1.CSV", line 38

ORA-06512: at "C##USER1.CSV", line 162

ORA-06512: at line 1

ORA-06512: at "C##USER1.CSV", line 278

ORA-06512: at "C##USER1.CSV", line 278

ORA-06512: at "C##USER1.EXPORT_02_PRODUCED_PURIFIED", line 5

ORA-06512: at "C##USER1.EXPORT_ALL_LYS_FOR_TABLEAU", line 5

这是错误指向的地方:

ORA-06512: at "C##USER1.EXPORT_02_PRODUCED_PURIFIED", line 5 在这儿:


CREATE OR REPLACE VIEW vw_export_02_produced_purified AS SELECT 
    pk_purified_enz_id,
    fk_construct_id as "fk_for_construct",
    fk_expr_system as "expression_system",
    CASE pr.valid 
        WHEN 1 THEN 'Yes'
        WHEN 0 THEN 'No'
    END as "Is this growth ok?",
    g_batch,
    p_batch,
    pur.concentration as "Concentration (uM)",
    pur.abts5_pur_checkpoint as "purification checkpoint",
    pur.yield as "Yield (mg/L)",
        CASE 
            WHEN pk_purified_enz_id IS NULL THEN ' ' 
            WHEN pk_purified_enz_id  IS NOT NULL THEN 
            buffer_mol || ' mM, ' || 
            fk_final_buffer_system || ' ' || 
            'pH ' || final_ph || ', ' ||
            final_nacl || ' mM NaCl' ||
            CASE 
                WHEN final_add IS NULL THEN ' ' 
                WHEN final_add IS NOT NULL THEN ', ' || final_add
            END
        END AS "Purification Buffer",
    buffer_mol,
    fk_final_buffer_system as "buffer system",
    final_ph,
    final_nacl,
    final_add as "other buffer additives" 
    
FROM produced pr FULL OUTER JOIN purified_enz pur
on pr.pk_produced_id = pur.fk_produced_id;


CREATE OR REPLACE PROCEDURE EXPORT_02_PRODUCED_PURIFIED AS 
    l_dataset sys_refcursor;
begin
    open l_dataset for select * from vw_export_02_produced_purified;
    csv.write_file
    ( p_dataset => l_dataset
    , p_heading => 'Y'
    , p_directory => 'EXTRACT_DIR'
    , p_filename => '02_produced_purified.txt' );
END EXPORT_02_PRODUCED_PURIFIED;
/

这个ORA-06512: at "C##USER1.EXPORT_ALL_LYS_FOR_TABLEAU", line 5来自主程序,它结合了所有较小的程序。

CREATE OR REPLACE PROCEDURE EXPORT_ALL_LYS_FOR_TABLEAU AS
BEGIN
EXPORT_00_CPP;
EXPORT_01_CONSTRUCT;
EXPORT_02_PRODUCED_PURIFIED;
EXPORT_03_CHAR;
EXPORT_04_CELL_DATA;
END EXPORT_ALL_LYS_FOR_TABLEAU;
/

被引用的表的 DDL:

CREATE TABLE PRODUCED (
  pk_produced_id NUMBER GENERATED ALWAYS AS IDENTITY,
  fk_construct_id NUMBER NOT NULL,
  g_batch VARCHAR2 (50) NOT NULL, 
  full_g_batch VARCHAR2 (200) GENERATED ALWAYS AS (g_batch || '-' || fk_construct_id) VIRTUAL,
  valid NUMBER (1) DEFAULT 1,
  fk_expr_system VARCHAR2 (50),

  CONSTRAINT pk_produced_id PRIMARY KEY (pk_produced_id),
  CONSTRAINT fk_p_construct_id FOREIGN KEY (fk_construct_id) REFERENCES construct (pk_construct_id),
  CONSTRAINT fk_expr_system FOREIGN KEY (fk_expr_system) REFERENCES EXPR_SYSTEM(pk_expr_system),
  CONSTRAINT uq_produced UNIQUE (fk_construct_id, g_batch) 
);

CREATE TABLE PURIFIED_ENZ (
  pk_purified_enz_id NUMBER GENERATED ALWAYS AS IDENTITY,
  fk_produced_id NUMBER, 
  p_batch VARCHAR2 (50) NOT NULL,
  pur_profile BLOB,
  fk_final_buffer_system VARCHAR2 (50),
  buffer_mol NUMBER (6, 2),
  final_nacl NUMBER (4),
  final_ph NUMBER (4, 2),
  final_add VARCHAR2 (50),
  yield NUMBER (6, 2),
  concentration NUMBER (6, 2),
  abts5_pur_checkpoint NUMBER (5, 2),
  
  CONSTRAINT pk_purified_enz_id PRIMARY KEY (pk_purified_enz_id),
  CONSTRAINT fk_produced_id FOREIGN KEY (fk_produced_id) REFERENCES produced (pk_produced_id),
  CONSTRAINT fk_final_buffer_system FOREIGN KEY (fk_final_buffer_system) REFERENCES buffer_system (pk_final_buffer_system),
  CONSTRAINT uq_purified_enz UNIQUE (fk_produced_id, p_batch)
  );
  

oracle csv
  • 1 1 个回答
  • 1989 Views

1 个回答

  • Voted
  1. Best Answer
    pmdba
    2020-08-30T05:11:25+08:002020-08-30T05:11:25+08:00

    根据您的堆栈跟踪,根本原因在 DBMS_SQL 中,由 CSV 包的第 38 行调用。第 38 行如下:

    dbms_sql.describe_columns(p_cursor_id, l_col_count, p_cursor_columns);
    

    这根本与您的数据无关,而是视图本身的代码。似乎正在发生的事情是您的视图中的列定义或别名太大而无法由过程调用处理。

    这很可能与 varchar 或 pl/sql 构造的 4000 或 32K 字符的总体限制无关,而是与 describe_columns 过程中的特定可变大小约束有关。它也可能与您在容器数据库而不是可插入数据库中执行此代码有关。

    使用您的表并查看 DDL 我无法在 PDB 中复制错误,因此我建议您先将您的工作负载移到那里,看看是否能解决您的问题。如果您仍然有问题,我会向 Oracle Support 开一张票,因为这也可能表明存在错误。

    • 3

相关问题

  • Oracle 中的数据库备份 - 导出数据库还是使用其他工具?

  • ORDER BY 使用文本列的自定义优先级

  • 舒服的sqlplus界面?[关闭]

  • 如何在数据库中找到最新的 SQL 语句?

  • 如何使用正则表达式查询名称?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve