【问题标题】:Altering return value of Varchar2 form default(4000) to (10char)?将 Varchar2 的返回值从默认(4000)更改为(10char)?
【发布时间】:2018-08-30 08:51:00
【问题描述】:

我的问题是:

create function jbmdate (p_date in varchar2)
return varchar2
as
begin
  return to_char(to_date(p_date,'YYYYMMDD'),'DD.MM.YYYY');
end;

如您所见,这将返回一个具有默认值的 varchar:4000 字节/字符。

但问题是它会在 GUI 中使用,所以 4000 是不走运的大。

那么我怎么可能将这个 varchar2 的返回值更改为 (10 char)?

应该是这样的

但我在 gui 中使用时看起来像这样。

所以真正的问题不是 gui 本身,而是 sql ......这里在 squirrle sql 中显示:

那么我怎样才能改变函数返回的精度。

【问题讨论】:

  • 该函数永远不会返回超过 8 个字符,而不是 4000 个字符。那么您的问题到底是什么?
  • 所以这个函数将在一个 gui 中使用,它会显示一个表: DATE-TIME:但是这个表的值是 varchar 2 默认值。所以有类似 20.20.2020 的日期,但显示为 20.20.2020 ...................................... .................................. (......作为示例排除在外)
  • 我用一张图片编辑了我的问题,以便更好地理解我的意思。
  • varchar 只存储与字符串长度一样多的字符,而不是字符串的长度。 Varchar2(4000)表示可以存储4000个字符,但是如果只存储8个字符的字符串,就只有8个而不是4000个。或者你的列是char类型?
  • 如果您的输出由于某种原因是20.20.2020.........................(顺便说一句,在您上传的图像中不可见),那么问题出在其他地方而不是函数中。正如@hotfix 提到的,您的函数仅返回 10 个字符。

标签: oracle plsql


【解决方案1】:

SQL Fiddle

Oracle 11g R2 架构设置

create function jbmdate (p_date in varchar2)
return varchar2
as
begin
  return to_char(to_date(p_date,'YYYYMMDD'),'DD.MM.YYYY');
end;
/

查询 1

SELECT '20180818' AS input,
       jbmdate( '20180818' ) AS dt,
       DUMP( jbmdate( '20180818' ) ) AS "dump"
FROM   DUAL

Results

|    INPUT |         DT |                                        dump |
|----------|------------|---------------------------------------------|
| 20180818 | 18.08.2018 | Typ=1 Len=10: 49,56,46,48,56,46,50,48,49,56 |

DUMP() 函数的输出中可以看出,返回的VARCHAR2 数据类型的长度为10。无论您的3990 个额外字节来自何处,它都不是由SQL 或PL/SQL 生成的,并且您应该在查询数据库的应用程序中进一步查看下游。

查询 2:如果您想将 VARCHAR2 显式转换为特定长度,则可以使用 CAST( your_value AS VARCHAR2(10) ) 函数将其转换为 10 的长度,但是,如您所见下面,它不会影响来自DUMP 的输出,因为返回值的长度已经为 10。

SELECT '20180818' AS input,
       CAST( jbmdate( '20180818' ) AS VARCHAR2(10) ) AS dt,
       DUMP( CAST( jbmdate( '20180818' ) AS VARCHAR2(10) ) ) AS "dump"
FROM   DUAL

Results

|    INPUT |         DT |                                        dump |
|----------|------------|---------------------------------------------|
| 20180818 | 18.08.2018 | Typ=1 Len=10: 49,56,46,48,56,46,50,48,49,56 |

【讨论】:

  • 因此,我们的 Framework/Application/Gui 使用精度,已经显示,返回为 4000,因为它是默认值。那是因为该函数返回 varchar2 -> default.... 您可以修剪、强制转换它或其他任何东西,但它不会对 varchar2 的结果做任何事情。 create function jbmdate (p_date in varchar2) return varchar2 // 每次对此处的过程执行任何操作时都会返回。因此,如果我在“AS”之后更改代码,则其无意义-> 将返回默认的 varchar2。 // 作为开始返回 to_char(to_date(p_date,'YYYYMMDD'),'DD.MM.YYYY');结束;
  • @ThomasMattmüller 然后寻找一种方法来覆盖框架的默认精度处理,以便您可以指定实际精度或尝试使用 CAST 包装函数调用以指定函数后的精度回来。因此,从您的图片来看,查询将是 select CAST( jbmdate( orhjobdt ) AS VARCHAR2(10) ) AS jobdatum, CAST( jbmtime( orhjobtm ) AS VARCHAR2(10) ) AS jobziet FROM ...,这是我在回答的查询 2 中所做的。
  • 我尝试了你的演员选择。现在它就像我希望它发生的那样。精度为 10。那么我最终能以某种方式将其放入函数中吗?我显然不是 sql 或数据库本身的专家。
  • @ThomasMattmüller 试试看。只需将返回行更改为像return CAST( to_char(to_date(p_date,'YYYYMMDD'),'DD.MM.YYYY') AS VARCHAR2(10) ); 这样的转换即可我做不到。
  • 我会的。非常感谢。
【解决方案2】:

函数只定义其返回值的基本类型(在本例中为VARCHAR2)。它无法定义更具体的长度来影响您的 GUI 使用的显示格式。

应用程序显示字符串的方式会有所不同。例如,PL/SQL Developer 将以您期望的紧凑形式显示输出,Oracle Live SQL 也是如此。

应该是这样的
...
但在 gui 中使用时看起来像这样。
...
所以真正的问题不是gui本身而是sql

我看不出您是如何得出这个结论的,因为很明显问题出在 GUI 中(SQuirreL SQL 客户端?)也许您可以在其他工具中尝试。

【讨论】:

  • 我通过在其他一些不同的工具中检查得出结论!无论我将在“to_char(to_date(p_date,'YYYYMMDD'),'DD.MM.YYYY');”中改变什么它不会被源 -> 每次“返回 varchar2”所困扰,将是正在返回的值,默认值为 varchar2 -> 4000 字节/字符。我需要处理这个......没有别的,这是我的问题......没有谷歌搜索,我得到了一个令人满意的结果。
  • @ThomasMattmüller 您的框架/应用程序/Gui 正在铸造结果或向您显示虚假信息;在 PL/SQL 中,varchar2 变量可以定义为 1 到 32767 字节之间的任意长度,而在 Oracle DBMS 中,表的长度为 1 到 4000 字节;存储到没有正确填充的字符串的当前长度;你的 Framework/Application/Gui 是什么,其他工具是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
  • 2019-09-03
  • 2016-03-17
  • 2021-03-26
  • 2014-05-16
相关资源
最近更新 更多