当前位置: 首页 > 知识库问答 >
问题:

PL/sqlutl\uhttp。请求-大括号/分号

松博耘
2023-03-14

我试图调用一个URL使用Oracle自治数据库中的UTL_HTTP包,并获得一个ORA-06512:

ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at "SYS.UTL_HTTP", line 1810
ORA-06512: at "SYS.UTL_HTTP", line 144
ORA-06512: at "SYS.UTL_HTTP", line 1745
ORA-06512: at line 1
06502. 00000 -  "PL/SQL: numeric or value error%s"
*Cause:    An arithmetic, numeric, string, conversion, or constraint error
           occurred. For example, this error occurs if an attempt is made to
           assign the value NULL to a variable declared NOT NULL, or if an
           attempt is made to assign an integer larger than 99 to a variable
           declared NUMBER(2).
*Action:   Change the data, how it is manipulated, or how it is declared so
           that values do not violate constraints.

正确配置了所有网络ACL等。

有问题的URL需要JSON直接在URL中,我知道这是不好的做法,但是我不能控制API。如果我删除花括号 ( {} ) 和分号 (: ), 使用UTL_HTTP请求工作,但输出不正确,因为JSON变得无效。

我尝试了使用在线编码器以及UTL_URL编码URL。

UTL_URL的编码是:

URL格式的一个示例是:

https://example.com/rest.php?entity=contact&action=get&json={"name": "Lorum Ipsum", "end_date": {"IS NULL": 1}, "return": "id,contact_id"}

我尝试了使用utl_http的直接选择。请求:

SELECT UTL_HTTP.REQUEST('https://example.com/rest.php?entity=contact&action=get&json={"name": "Lorum Ipsum", "end_date": {"IS NULL": 1}, "return": "id,contact_id"}') FROM DUAL;

并使用PL/SQL调用:

declare
    req UTL_HTTP.REQ;
    resp UTL_HTTP.RESP;
    val VARCHAR2(2000);
    str varchar2(1000);
begin
    req := UTL_HTTP.BEGIN_REQUEST('https://example.com/rest.php?entity=contact&action=get&json={"name": "Lorum Ipsum", "end_date": {"IS NULL": 1}, "return": "id,contact_id"}');
    resp := UTL_HTTP.GET_RESPONSE(req);
    LOOP
        UTL_HTTP.READ_LINE(resp, val, TRUE);
        DBMS_OUTPUT.PUT_LINE(val);
    END LOOP;
UTL_HTTP.END_RESPONSE(resp);
EXCEPTION
    WHEN UTL_HTTP.END_OF_BODY
THEN
    UTL_HTTP.END_RESPONSE(resp);
END;

/

如何使用UTL_HTTP调用此url?

共有1个答案

翁烨霖
2023-03-14

他们在UTL_URL文档中讨论了这一点,但冒号是保留字符——它们在URL的某些部分有效,但在其他部分无效。(完全不允许使用大括号。)关于它们在URL的查询部分是否有效,有一些争论——RFC中的ABNF似乎说是的,但许多实现不允许这样做。

默认情况下,UTL\u URL。转义不会转义保留字符(因为这会使https://部分出错,等等),但是您可以通过将TRUE作为第二个参数来更改它。通常,最佳做法似乎是转义可能包含保留字符的任何查询字符串中的保留字符:

req := UTL_HTTP.BEGIN_REQUEST('https://example.com/rest.php?entity=contact&action=get&json=' 
       || utl_url.escape('{"name": "Lorum Ipsum", "end_date": {"IS NULL": 1}, "return": "id,contact_id"}'
            ,TRUE));

看看这是否有帮助?

 类似资料:
  • 本文向大家介绍浅析python 中大括号中括号小括号的区分,包括了浅析python 中大括号中括号小括号的区分的使用技巧和注意事项,需要的朋友参考一下 python语言最常见的括号有三种,分别是:小括号( )、中括号[ ]和大括号也叫做花括号{ }。其作用也各不相同,分别用来代表不同的python基本内置数据类型。 1.python中的小括号( ):代表tuple元组数据类型,元组是一种不可变序列

  • 我理解无限的原因。但是为什么它是一个编译器,当我在括号里不使用变量的时候? 这将返回一个无限循环。 这将返回编译器错误。为什么?

  • 我有一个类型TEXT的PostgreSQL列中的数据,我需要做一些字符替换。具体来说,我想用大括号代替方括号。问题是,我只想替换不超过两层深的括号,如果你包括主要的封闭括号。这些字符串可能很长,所以我认为正则表达式可能是最好的方法(函数),但我不擅长正则表达式。这里有一个这样的值的例子: 因此,我希望此字符串更改为: 提前谢谢!

  • 问题内容: 我试图理解下面两个require语句之间的区别。 具体来说,s包装的目的是什么? 它们似乎都分配了电子模块的内容,但是它们的功能显然不同。 谁能给我一些启示? 问题答案: 第二个示例使用解构。 这将调用从所需模块导出的特定变量(包括函数)。 例如(functions.js): 包含在您的文件中: 现在您可以分别给他们打电话了, 相对于: 使用点表示法调用: 希望这可以帮助。 您可以在此

  • 问题内容: 我对以下代码行的语法感到困惑: 数据框对象由2列(“大脑”和“身体”)组成 当我打印x_values时,我得到这样的东西: 就dataframe对象的属性和方法而言,我知道pandas文档,但双括号语法使我感到困惑。 问题答案: 考虑一下: 来源DF: 选择一列-生成Pandas.Series: 选择DataFrame的子集-结果为DataFrame: 结论: 第二种方法允许我们从Da

  • axios的url上带小括号()会报400 我使用axios的get请求下载文件时,给后台发送了文件的文件名,文件名上有小括号,axios会转义中文字符,小括号不被转义 手动转义 我以为是小括号没有被转义报的错,于是手动转义了,但还是不行 这个url看着也没问题,为什么会报400呢? 而且只要文件名不带小括号,就可以下发成功