使用“getclobval()”执行 oracle 过程时出现“无效字符错误”

2023-12-02

以下过程可以成功编译ctrll + S(显示有效)但执行时会抛出错误:Invalid character error执行此操作时procedure on SQL DEVELOPER。 我没有看到任何地方有无效字符。

以下是创建表并插入值的代码:-

 CREATE TABLE tempt( "set" VARCHAR2(1), "level" VARCHAR2(1), category VARCHAR2(3), value INT );

INSERT INTO tempt
SELECT 'A', 'Z', 'ABC', 847549 FROM dual UNION ALL
SELECT 'A', 'Y', 'ABC', 955808 FROM dual UNION ALL
SELECT 'A', 'X', 'ABC', 983462 FROM dual UNION ALL
SELECT 'A', 'Z', 'GHI', 762369 FROM dual UNION ALL
SELECT 'A', 'Y', 'DEF', 615863 FROM dual UNION ALL
SELECT 'A', 'X', 'DEF', 474257 FROM dual UNION ALL
SELECT 'B', 'Z', 'ABC', 959843 FROM dual UNION ALL
SELECT 'B', 'Y', 'ABC', 821704 FROM dual UNION ALL
SELECT 'B', 'X', 'ABC', 377211 FROM dual UNION ALL
SELECT 'B', 'Z', 'DEF', 945053 FROM dual UNION ALL
SELECT 'B', 'Y', 'DEF', 919120 FROM dual UNION ALL
SELECT 'B', 'Y', 'ABC', 821704 FROM dual UNION ALL
SELECT 'C', 'X', 'ABC', 377211 FROM dual UNION ALL
SELECT 'C', 'Z', 'DEF', 945053 FROM dual UNION ALL
SELECT 'C', 'Y', 'DEF', 919120 FROM dual UNION ALL
SELECT 'D', 'X', 'ABC', 377211 FROM dual UNION ALL
SELECT 'D', 'Z', 'DEF', 945053 FROM dual UNION ALL
SELECT 'D', 'Y', 'GHI', 919120 FROM dual UNION ALL
SELECT 'E', 'X', 'ABC', 377211 FROM dual UNION ALL
SELECT 'E', 'Z', 'DEF', 945053 FROM dual UNION ALL
SELECT 'E', 'Y', 'ABC', 919120 FROM dual UNION ALL
SELECT 'E', 'Z', 'ABC', 945053 FROM dual UNION ALL
SELECT 'E', 'Y', 'DEF', 919120 FROM dual UNION ALL
SELECT 'B', 'X', 'IJK', 326886 FROM dual

这是在 SQL Developer/DB viz 的过程窗口内运行的:-

CREATE OR REPLACE PROCEDURE "SCHEMA.pivot"(v_recordset out sys_refcursor)
AS
--v_recordset SYS_REFCURSOR;
  v_sql       long;
  v_cols_1    long;
  v_cols_2    clob; 

BEGIN
  SELECT LISTAGG( ''''||"level"||''' AS "'||"level"||'"' , ',' )
          WITHIN GROUP ( ORDER BY "level" DESC )
    INTO v_cols_1
    FROM (
          SELECT DISTINCT "level"
            FROM tempt
          );

SELECT DBMS_XMLGEN.CONVERT (
          RTRIM (
           XMLAGG (XMLELEMENT (
                        e,
                          'MAX(CASE WHEN CATEGORY = '
                      || CHR (39)
                       || CATEGORY
                       || CHR (39)
                       || ' THEN '
                      || CHR (39)
                      || "level"
                       || CHR (39)
                      || ' END) AS '
                       || "level"
                      || '_'
                       || CATEGORY
                      || '',
                       ',')
                    ORDER BY 1 DESC).EXTRACT ('//text()').getclobval (),
           ','))
    INTO v_cols_2
   FROM (SELECT DISTINCT "level", CATEGORY
          FROM tempt);
                      

  v_sql :=
  'SELECT "set", ('|| v_cols_2 ||')
     FROM
     (
      SELECT *
        FROM tempt
           PIVOT
           (
            MAX(value) FOR "level" IN ( '|| v_cols_1 ||' )
           )
          )
          GROUP BY "set"
          ORDER BY "set"'; 
      v_sql := REPLACE (v_sql, ''', CHR (39));
      DBMS_OUTPUT.PUT_LINE(v_sql);
       
      OPEN v_recordset FOR v_sql;
 end pivot;

EDIT 1:我运行了答案中提供的查询,尽管编译成功,但我得到了Invalid Character错误 :-

00911. 00000 - "invalid character" *Cause: identifiers may not start with any ASCII character other than letters and numbers. $#_ are also allowed after the first character. Identifiers enclosed by doublequotes may contain any character other than a doublequote. Alternative quotes (q'#...#') cannot use spaces, tabs, or carriage returns as delimiters. For all other contexts, consult the SQL Language Reference Manual.我看过其他有同样问题的帖子,并尝试了所有方法,但似乎没有解决问题。它显示的错误行是OPEN v_recordset FOR v_sql;


应该

SQL> CREATE OR REPLACE PROCEDURE pivot (v_recordset OUT SYS_REFCURSOR)
  2  AS
  3     --v_recordset SYS_REFCURSOR;
  4     v_sql     LONG;
  5     v_cols_1  LONG;
  6     v_cols_2  CLOB;
  7  BEGIN
  8     SELECT LISTAGG ('''' || "level" || ''' AS "' || "level" || '"', ',')
  9               WITHIN GROUP (ORDER BY "level" DESC)
 10       INTO v_cols_1
 11       FROM (SELECT DISTINCT "level"
 12               FROM tempt);
 13
 14     SELECT DBMS_XMLGEN.CONVERT (
 15               RTRIM (
 16                  XMLAGG (XMLELEMENT (
 17                             e,
 18                                'MAX(CASE WHEN CATEGORY = '
 19                             || CHR (39)
 20                             || CATEGORY
 21                             || CHR (39)
 22                             || ' THEN '
 23                             || CHR (39)
 24                             || "level"
 25                             || CHR (39)
 26                             || ' END) AS '
 27                             || "level"
 28                             || '_'
 29                             || CATEGORY
 30                             || '',
 31                             ',')
 32                          ORDER BY 1 DESC).EXTRACT ('//text()').getclobval (),
 33                  ','))
 34       INTO v_cols_2
 35       FROM (SELECT DISTINCT "level", CATEGORY
 36               FROM tempt);
 37
 38     v_sql := 'SELECT "set", ' || v_cols_2 || '
 39       FROM
 40       (
 41        SELECT *
 42          FROM tempt
 43             PIVOT
 44             (
 45              MAX(value) FOR "level" IN ( ' || v_cols_1 || ' )
 46             )
 47            )
 48            GROUP BY "set"
 49            ORDER BY "set"';
 50     v_sql := REPLACE (v_sql, ''', CHR (39));
 51     DBMS_OUTPUT.PUT_LINE (v_sql);
 52
 53     OPEN v_recordset FOR v_sql;
 54  END pivot;
 55  /

Procedure created.

SQL>

Testing:

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2     l_rc  SYS_REFCURSOR;
  3  BEGIN
  4     pivot (l_rc);
  5  END;
  6  /
SELECT "set", MAX(CASE WHEN CATEGORY = 'GHI' THEN 'Y' END) AS Y_GHI,MAX(CASE
WHEN CATEGORY = 'ABC' THEN 'Y' END) AS Y_ABC,MAX(CASE WHEN CATEGORY = 'ABC' THEN
'Z' END) AS Z_ABC,MAX(CASE WHEN CATEGORY = 'DEF' THEN 'Z' END) AS Z_DEF,MAX(CASE
WHEN CATEGORY = 'IJK' THEN 'X' END) AS X_IJK,MAX(CASE WHEN CATEGORY = 'GHI' THEN
'Z' END) AS Z_GHI,MAX(CASE WHEN CATEGORY = 'DEF' THEN 'X' END) AS X_DEF,MAX(CASE
WHEN CATEGORY = 'ABC' THEN 'X' END) AS X_ABC,MAX(CASE WHEN CATEGORY = 'DEF' THEN
'Y' END) AS Y_DEF
     FROM
     (
      SELECT *
        FROM tempt

PIVOT
           (
            MAX(value) FOR "level" IN ( 'Z' AS "Z",'Y' AS
"Y",'X' AS "X" )
           )
          )
          GROUP BY "set"

ORDER BY "set"

PL/SQL procedure successfully completed.

SQL>

运行结果查询会产生以下结果(已截取):

SQL> SELECT "set", MAX(CASE WHEN CATEGORY = 'GHI  <snip>
ORY = 'DEF' THEN 'Z' END) AS Z_DEF,MAX(CASE WHEN  <snip>
(CASE WHEN CATEGORY = 'ABC' THEN 'X' END) AS X_A  <snip>
  2       FROM
  3       (
  4        SELECT *
  5          FROM tempt
  6             PIVOT
  7             (
  8              MAX(value) FOR "level" IN ( 'Z'
  9             )
 10            )
 11            GROUP BY "set"
 12            ORDER BY "set"
 13  /

s Y Y Z Z X Z X X Y
- - - - - - - - - -
A Y Y Z Z   Z X X Y
B   Y Z Z X   X X Y
C   Y Z Z     X X Y
D Y Y Z Z   Z X X Y
E   Y Z Z     X X Y

SQL>

P.S. 忘了说: 真的吗,really, REALLY在双引号下使用小写字母命名列是个坏主意。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用“getclobval()”执行 oracle 过程时出现“无效字符错误” 的相关文章

  • 替换 Oracle 包的一部分

    我需要修改包内的一个过程 我需要接触声明和实施 由于我正在维护每次修改的补丁文件 因此我希望更改最小化 我可以仅使用更改的过程更新包 如果是 如何更新 还是需要提供完整的包定义和实现 您需要替换整个包规范和主体 您不能仅对包的一部分进行操作
  • Oracle:使用SQL或PL/SQL查找动态SQL中的错误位置

    如何在 PL SQL 或 SQL 中找到动态 SQL 语句中的错误位置 从 SQL Plus 中 我看到了错误的位置 例如 无效的 SQL DML 语句 SYS orcl gt SELECT 2 X 3 FROM 4 TABLEX 5 TA
  • APEX 安装失败,PLS-00201:必须声明标识符“SYS.DBMS_DB_VERSION”

    尝试在 Oracle XE 18c 数据库上安装 Oracle APEX 20 2 如下官方说明 https docs oracle com en database oracle application express 20 1 htmig
  • Mysql 创建定义器

    我创建了一个在 CentOS Web 服务器上运行的 Intranet Web 应用程序 该应用程序使用另一个本地服务器 始终是 CentOS 作为 MySQL 数据库 在数据库内部我创建了例程 这些例程总是这样开始 CREATE DEFI
  • 如何从 SQL Server 存储过程返回值并在 Access VBA 中使用它们

    我已经在 SQL Server 中设置了一个运行良好的存储过程 我现在可以从 VBA 调用它 但想返回一个值以了解是否存在任何错误等 我的 SP 中的最后一个参数设置为 OUTPUT DataSetID int 0 Destination
  • 在触发期间更新 oracle 中的同一行?

    简短的问题 因为我不知道如何搜索这个 我可以 重新更新 同一行吗 例如 我有一个存储付款小计的字段 并且考虑到我的业务限制 我可以更新该值 我可以仅用触发器更新同一行的总计吗 预先谢谢您 顺便说一句 我正在使用 Oracle 和 PL SQ
  • 插入后,数据库中仅插入“字符串”的一个字符

    Below is my table screenshot Data after insertion C 代码 SqlConnection con new SqlConnection connectionsession Con con Ope
  • 如何在 Oracle PLSQL 中提交单个事务

    我需要编写一个 PL SQL 过程 在这个过程中 我需要在其自己的事务范围内调用另一个过程 并提交它 无论主事务是否失败或提交 换句话说 我需要类似的东西REQUIRES NEW交易传播 就像是 procedure mainProcedur
  • 数据库字段中的逗号分隔值

    我有一个产品表 该表中的每一行对应一个产品 并由唯一的 ID 标识 现在 每个产品都可以有多个与该产品关联的 代码 例如 Id Code 0001 IN ON ME OH 0002 ON VI AC ZO 0003 QA PS OO ME
  • MYSQL - 使用逗号分隔字符串作为变量输入的存储过程

    我希望有人能够提供帮助 我已经创建了我的第一个存储过程 没什么花哨的 但是我遇到了问题 我想给它一个字符串输入 例如 1 2 3 4 5 然后它执行一个简单的操作SELECT FROM TABLE WHERE EAN IN VAR 所以存储
  • 同时从2个表中删除?

    我正在使用 asp net 和 sql 服务器 我有 2 个表 类别和产品 在产品表中 我的categoryId 为FK 我想要做的是 当我从类别表中删除类别时 我希望该类别中的所有产品都将在产品表中删除 如何才能做到这一点 我更喜欢使用存
  • DBMS_UTILITY.COMPILE_SCHEMA(schema => '',compile_all => FALSE) 不会编译无效的包体

    的召唤 BEGIN DBMS UTILITY COMPILE SCHEMA schema gt
  • 如何通过代码确定Oracle数据类型的字符串值?

    I use DBMS SQL DESCRIBE COLUMNS过程来确定 SELECT 查询的结果集中的列使用什么数据类型 但不幸的是这样我只能得到Oracle数据类型的代码 record col type 1 8 12 等 所以我想知道
  • mysql存储过程语法错误

    好的 这只是我编写的第二个存储过程 我想你会明白的 我正在尝试关闭信用额度以及所有发票 费用 票据等 但我收到语法错误 目标是调用 close account proc 398985994 DELIMITER CREATE PROCEDUR
  • 将一个范围分组到一个范围

    我有一张桌子 tblUnit ID Name PriceFrom PriceTo 1 Audi 170 340 2 BMW 250 290 3 Ford 275 500 4 Kia 110 250 5 VW 135 460 然后我预先定义了
  • 如何从 pl sql 过程运行 sql 脚本

    我有一个类似的程序 CREATE OR REPLACE PROCEDURE test is BEGIN DBMS OUTPUT PUT LINE This is a Test END 我想运行一些存储在当前目录中的sql脚本 我可以使用 s
  • 如何根据 Oracle 中的动态列表检查 IN 条件?

    编辑 更改标题以适合下面的代码 我试图从 Oracle 表中检索可接受值的列表 然后对另一个表执行 SELECT 同时将某些字段与所述列表进行比较 我试图用光标来做到这一点 如下所示 但是失败了 DECLARE TYPE gcur IS R
  • 删除带有全局索引的分区表?

    PROCEDURE purge partitions p owner IN VARCHAR2 p name IN VARCHAR2 p retention period IN NUMBER IS BEGIN FOR partition re
  • 创建触发器

    如何启动触发器 以便在未付余额超过 50 美元的情况下无人能够租借电影 这里有一个跨行表约束 即你不能只放置一个 OracleCONSTRAINT在列上 因为它们一次只能查看一行中的数据 Oracle 仅支持两种跨 行约束类型 唯一性 例如
  • 使用存储过程访问数据可以提供哪些安全优势?

    我看到一些指南建议您通过存储过程对所有数据访问进行分层来保护数据库 我知道对于 SQL Server 您可以保护表甚至列免受 CRUD 操作的影响 例如 Logged in as sa USE AdventureWorks GRANT SE

随机推荐

  • python 2.7 的非 ASCII 标识符

    我知道在 python 3 x 中我可以使用非 ASCII 标识符 PEP 3131 x1 2 x2 4 x x2 x1 print x python 2 7有这样的功能吗 也许 有人将它移植到 2 x 分支吗 不 Python 2 中没有
  • 调用 C# 代码时,PowerShell $null 不再为 null

    在 PowerShell 中 我们可以定义 C 代码并执行它 将 null 传递到以下最简单的函数中表明 not null 被传递到函数中 Add Type TypeDefinition public static class foo pu
  • 用于访问另一个域上的文件的 CORS 标头

    我正在尝试在 Codepen 上创建一个音频可视化程序 我使用 apache 创建了自己的 Ubuntu Web 服务器 它允许我直接访问以修改服务器的标头和配置 虽然浏览器可以访问不同域上的文件 但它需要特殊的 CORS 标头来读取音频中
  • 无法连接到 android 5.1 上的本机本地套接字

    我有命令行工具 它发送广播并等待结果 服务器代码 错误处理省略 int makeAddr const char name struct sockaddr un pAddr socklen t pSockLen int nameLen str
  • 某些象形文字语言中的字计数器?

    是否有任何可用的库用于某些象形文字语言的字数统计 例如 中文 日文 韩文 我发现 MS Word 可以有效地计算这些语言的文本 我可以在 NET 应用程序中添加对 MS Word 库的引用来实现此功能吗 或者还有其他解决方案可以达到这个目的
  • 类型错误:第一个参数必须是可调用的,defaultdict

    错误来自publishDB defaultdict defaultdict 我想制作一个像这样的数据库 subject1 student id assignemt1 marks assignment2 marks finals marks
  • 耙子中止! ActiveRecord::Base:Class 的未定义方法“migration_error=”

    我正在 Ruby on Rails 上开发项目 到目前为止 我使用 Rails 4 一切都很好 然后我遇到了 gem 的无能问题 我决定回滚到 Rails 3 更改了 Gemfile 删除了 Gemfile lock 所有 Rails 安装
  • Play WS API:限制请求速率

    我正在使用异步 Play WS Scala API 来查询 RESTful 服务 我想知道如何处理List包含要通过以下方式调用的请求 URLWSClient 但每秒不得超过 1 个请求 该服务允许每个客户端每秒 仅 1 个请求 从逻辑的角
  • 尝试使用 Github Actions 复制存储库时出现身份验证错误

    我有一堆使用 Azure Pipelines 进行 CI CD 的存储库 我现在正在尝试将其移植到 Github Actions 这是我正在做的第一个工作 https github com Azure AzureAuth tree fix
  • 快速跨平台 C/C++ 图像处理库

    有哪些用于图像处理的跨平台和高性能图像库 调整大小和查找颜色 色调直方图 无需图形用户界面 这是针对 C C 的 到目前为止我已经研究过 OpenCV GIL 作为 Boost 的一部分 DevIL CImg 我的问题 我上面列出的性能如何
  • 将回形针图像复制到 Rails 4 中的新记录

    我的网站用于发布专辑评论 称为 Pin 图 引脚模型具有以下属性 艺术家 年份 标题 排名 描述和 图像 该图像使用 Paperclip 并存储在 Amazon S3 上 如果重要的话 我试图允许用户查看其他用户发布的评论 并单击链接以更简
  • java中的超链接

    有没有什么方法可以在Java中的JTextArea中创建可点击的超链接 如果您绝对想使用 jTextArea 可以执行此操作的一种方法是获取 User MouseClick x y 位置 然后从那里进行处理 然而 更简单的方法是使用 JEd
  • 如何在android中获取画布中屏幕尺寸的大小?

    我能够在正常活动中获取屏幕尺寸 但我需要在画布视图中获取屏幕尺寸并根据它进行操作 上面的任何片段都会有所帮助 谢谢 我得到了 widthPixels heightPixels 使用这个 DisplayMetrics metrics getB
  • 在 WooCommerce 中以编程方式对保存的信用卡收费

    我正在 WooCommerce 中以编程方式创建订单 并且需要向默认保存的信用卡收费 我正在使用 WooCommerce stripe 插件 并已弄清楚如何设置正确的付款方式 但无法弄清楚如何实际向卡收费 下面是我到目前为止的代码 orde
  • Grails 使用 config.properties 值到 BuildConfig.groovy 中

    我有一个config properties文件下conf目录 并在上面的文件中有一个条目 如下所示 grails tomcat version 2 2 4 我如何使用这个值BuildConfig groovy file Suppose pl
  • iPhone - 用于文本转语音功能的 API [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我想知道iPhone是否有支持文本转语音功能的API 我环顾四周但没有找到任何东西 所以只是想确认一下 期待中感谢 我曾经遇到过这个问题 并在 iP
  • 约束编程:多个工人的调度

    我是约束编程的新手 我想这是一个简单的问题 但我无法解决它 问题是这样的 我们有多台机器 N 每台机器的资源都是有限的 比如说内存 所有机器的资源可以相同 我们有 T 个任务 每个任务都有一个持续时间 并且每个任务都需要一定量的资源 只要不
  • 加密 url 中 id 的好方法是什么?

    我一直在网上查看有关在 url 中加密 id 的解决方案的文章 我已经尝试过基本的编码解码 但是在下一页上解码时遇到问题 我在其中进行选择 其中 id 解码的 id 它不会从表中获取正确的用户 我的链接 My link a href Vie
  • file_put_contents 正在向代码添加反斜杠

    I use file get contents file put contents 加载和保存 css文件 保存加载的文件后file put contents 函数将转义引号 如何防止这种情况 file pathto base css ta
  • 使用“getclobval()”执行 oracle 过程时出现“无效字符错误”

    以下过程可以成功编译ctrll S 显示有效 但执行时会抛出错误 Invalid character error执行此操作时procedure on SQL DEVELOPER 我没有看到任何地方有无效字符 以下是创建表并插入值的代码 CR