在 Oracle 对象类型构造函数中设置默认值

2023-12-20

我想在 Oracle 对象类型中设置默认值,但它要求所有属性都需要在构造函数中传递。

无论如何,这样我就可以在构造函数中仅传递需要默认值的必需属性。

请参阅以下详细信息




    SQL> CREATE TYPE TYPE_SUB AS OBJECT(
      2  COL1 NUMBER,
      3  COL2 VARCHAR2(100)
      4  )
      5  NOT FINAL
      6  /

    Type created.

    SQL> CREATE OR REPLACE TYPE TYPE_MAIN
      2  UNDER TYPE_SUB
      3  (
      4  COL3 varchar2(10),
      5  COL4 VARCHAR2(10),
      6  CONSTRUCTOR FUNCTION TYPE_MAIN(COL1 NUMBER, COL2 VARCHAR2, COL3 varchar2, COL4 VARCHAR2) RETURN SELF AS RESULT)
      7  NOT FINAL
      8  /

    Type created.

    SQL> CREATE OR REPLACE TYPE BODY TYPE_MAIN  IS
      2  CONSTRUCTOR FUNCTION TYPE_MAIN (COL1 NUMBER, COL2 VARCHAR2, COL3 varchar2, COL4 VARCHAR2) RETURN SELF AS RESULT IS
      3  BEGIN
      4   SELF.COL1 := nvl(COL1,123);
      5   SELF.COL2 := nvl(COL2,'NA');
      6   SELF.COL3 := nvl(COL3,'NA');
      7   SELF.COL4 := nvl(COL4,NULL);
      8   RETURN;
      9  end;
     10  END;
     11  /

    Type body created.

    SQL> CREATE TABLE TAB_MAIN  (
      2  PKEY NUMBER,
      3  COLTEST VARCHAR2(100),
      4  COLNEW TYPE_MAIN)
      5  /

    Table created.

    SQL> INSERT INTO TAB_MAIN(PKEY) VALUES(1)
      2  /

    1 row created.

    SQL> INSERT INTO TAB_MAIN(PKEY,COLTEST,COLNEW) VALUES(1,'TESTCOL',TYPE_MAIN('1','2',NULL,NULL))
      2  /

    1 row created.

    SQL> INSERT INTO TAB_MAIN(PKEY,COLTEST,COLNEW) VALUES(1,'TESTCOL2',TYPE_MAIN('1',NULL,NULL,NULL))
      2  /

    1 row created.

    SQL> SELECT * FROM TAB_MAIN
      2  /

          PKEY COLTEST    COLNEW(COL1, COL2, COL3, COL4)
    ---------- ---------- ----------------------------------------
             1
             1 TESTCOL    TYPE_MAIN(1, '2', 'NA', NULL)
             1 TESTCOL2   TYPE_MAIN(1, 'NA', 'NA', NULL)

  

现在,在上面的示例中,如果我在构造函数中仅传递 Col3 和 Col4 属性作为默认值,那么它不起作用。请看下面的例子。




    SQL> CREATE TYPE TYPE_SUB AS OBJECT(
      2  COL1 NUMBER,
      3  COL2 VARCHAR2(100)
      4  )
      5  NOT FINAL
      6  /

    Type created.

    SQL> CREATE OR REPLACE TYPE TYPE_MAIN
      2  UNDER TYPE_SUB
      3  (
      4  COL3 varchar2(10),
      5  COL4 VARCHAR2(10),
      6  CONSTRUCTOR FUNCTION TYPE_MAIN(COL3 varchar2, COL4 VARCHAR2) RETURN SELF AS RESULT)
      7  NOT FINAL
      8  /

    Type created.

    SQL> CREATE OR REPLACE TYPE BODY TYPE_MAIN  IS
      2  CONSTRUCTOR FUNCTION TYPE_MAIN (COL3 varchar2, COL4 VARCHAR2) RETURN SELF AS RESULT IS
      3  BEGIN
      4   SELF.COL3 := nvl(COL3,'NA');
      5   SELF.COL4 := nvl(COL4,NULL);
      6   RETURN;
      7  end;
      8  END;
      9  /

    Type body created.

    SQL> CREATE TABLE TAB_MAIN  (
      2  PKEY NUMBER,
      3  COLTEST VARCHAR2(100),
      4  COLNEW TYPE_MAIN)
      5  /

    Table created.

    SQL> INSERT INTO TAB_MAIN(PKEY) VALUES(1)
      2  /

    1 row created.

    SQL> INSERT INTO TAB_MAIN(PKEY,COLTEST,COLNEW) VALUES(1,'TESTCOL',TYPE_MAIN('1','2',NULL,NULL))
      2  /

    1 row created.

    SQL> INSERT INTO TAB_MAIN(PKEY,COLTEST,COLNEW) VALUES(1,'TESTCOL2',TYPE_MAIN('1',NULL,NULL,NULL))
      2  /

    1 row created.

    SQL> SELECT * FROM TAB_MAIN
      2  /

          PKEY COLTEST    COLNEW(COL1, COL2, COL3, COL4)
    ---------- ---------- ----------------------------------------
             1
             1 TESTCOL    TYPE_MAIN(1, '2', NULL, NULL)
             1 TESTCOL2   TYPE_MAIN(1, NULL, NULL, NULL)

  

在第二个代码块中,您没有调用只有两个参数的构造函数。传递 null 参数并不意味着您使用另一个构造函数,而是使用四个参数调用(默认)构造函数,其中两个参数恰好是有意为 null 的。你正在有效地做:

TYPE_MAIN(col1 => '1', col2 => NULL, col3 => NULL, col4 => NULL)

not

TYPE_MAIN(col3 => '1', col4 => NULL)

所以这有效:

INSERT INTO TAB_MAIN(PKEY,COLTEST,COLNEW) VALUES(1,'TESTCOL2',TYPE_MAIN('3','4'))
/

...

      PKEY COLTEST         COLNEW                                           
---------- --------------- --------------------------------------------------
         1                                                                    
         1 TESTCOL         TYPE_MAIN(1,'2',NULL,NULL)           
         1 TESTCOL2        TYPE_MAIN(1,NULL,NULL,NULL)          
         1 TESTCOL2        TYPE_MAIN(NULL,NULL,'3','4')         

为了让默认值按照我认为您在第一个代码块中的预期工作,请将它们设置在构造函数参数中,而不是在构造函数的主体中:

CREATE OR REPLACE TYPE TYPE_MAIN
UNDER TYPE_SUB
(
COL3 varchar2(10),
COL4 VARCHAR2(10),
CONSTRUCTOR FUNCTION TYPE_MAIN(COL1 number default 123,
  COL2 VARCHAR2 default 'NA',
  COL3 varchar2 default 'NA',
  COL4 VARCHAR2 default null) RETURN SELF AS RESULT)
NOT FINAL
/

CREATE OR REPLACE TYPE BODY TYPE_MAIN  IS
CONSTRUCTOR FUNCTION TYPE_MAIN (COL1 number default 123,
  COL2 VARCHAR2 default 'NA',
  COL3 varchar2 default 'NA',
  COL4 VARCHAR2 default null) RETURN SELF AS RESULT IS
BEGIN
 SELF.COL1 := COL1;
 SELF.COL2 := COL2;
 SELF.COL3 := COL3;
 SELF.COL4 := COL4;
RETURN;
end;
END;
/

然后,当仅传递一个参数时(或者任何时候您没有传递所有参数,或者您想要按顺序覆盖的前几个参数)col1)你需要命名它,而不是传递null对于其他人,因为这只会覆盖默认值。

INSERT INTO TAB_MAIN(PKEY) VALUES(1)
/

INSERT INTO TAB_MAIN(PKEY,COLTEST,COLNEW)
VALUES(1,'TESTCOL',TYPE_MAIN(1,'2'))
/

INSERT INTO TAB_MAIN(PKEY,COLTEST,COLNEW)
VALUES(1,'TESTCOL2',TYPE_MAIN(1))
/

INSERT INTO TAB_MAIN(PKEY,COLTEST,COLNEW)
VALUES(1,'TESTCOL3',TYPE_MAIN(col3 => '3'))
/

INSERT INTO TAB_MAIN(PKEY,COLTEST,COLNEW)
VALUES(1,'TESTCOL4',TYPE_MAIN(col4 => '4'))
/

      PKEY COLTEST         COLNEW                                           
---------- --------------- --------------------------------------------------
         1                                                                    
         1 TESTCOL         TYPE_MAIN(1,'2','NA',NULL)           
         1 TESTCOL2        TYPE_MAIN(1,'NA','NA',NULL)          
         1 TESTCOL3        TYPE_MAIN(123,'NA','3',NULL)         
         1 TESTCOL4        TYPE_MAIN(123,'NA','NA','4')         

想要同时通过col3 and col4您仍然需要命名参数,否则它会假设您从col1:

INSERT INTO TAB_MAIN(PKEY,COLTEST,COLNEW)
VALUES(1,'TESTCOL5',TYPE_MAIN(col3 => '3', col4 => '4'))
/

      PKEY COLTEST         COLNEW                                           
---------- --------------- --------------------------------------------------
         1                                                                    
         1 TESTCOL         TYPE_MAIN(1,'2','NA',NULL)           
         1 TESTCOL2        TYPE_MAIN(1,'NA','NA',NULL)          
         1 TESTCOL3        TYPE_MAIN(123,'NA','3',NULL)         
         1 TESTCOL4        TYPE_MAIN(123,'NA','NA','4')         
         1 TESTCOL5        TYPE_MAIN(123,'NA','3','4')          
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Oracle 对象类型构造函数中设置默认值 的相关文章

  • Oracle SQL - 如何使用 RANK() 或 DENSE_RANK() 和 ROW_NUMBER() 分析函数获取不同的行?

    我希望获得每个部门前 3 名不同的薪资 我能够使用RANK or DENSE RANK or ROW NUMBER 但我的表有一些工资相同的记录 下面提到的是我的查询及其结果 20部薪资前三名应该是6000 3000 2975 但是有 2
  • 如何从视图中使用模型函数? - 拉拉维尔 5.4

    我在模型类中创建了一个函数 它是 public function scopetest query return query gt pluck name 我的控制器代码是 public function index books Book al
  • 是否可以在 .NET 中编写仅接受数字类型的通用函数?

    假设我想编写一个如下所示的函数 像往常一样 一个简单的示例用于说明目的 Public Function calcSqSum Of T ByVal list As IEnumerable Of T As T Dim sumSq As T Fo
  • 尝试在 Oracle 11.2.0.2.0(64 位)中获取连接时出现 java.lang.ArithmeticException

    我目前正在 Oracle 中使用 Java 存储过程 并且在尝试在 Java 代码中获取连接时看到一些奇怪的行为 我的Java被打包成jar文件 然后使用以下命令部署到Oracle中loadjava命令行实用程序 Apackage然后在数据
  • 如何记录更改列 DDL 操作

    我需要创建一个数据库触发器来记录每个更改 Add Column Modify Column Drop Column 使用Oracle的模式触发器在特定表中执行语句 如何获得 到目前为止我尝试了下面的代码 TRIGGER after ddl
  • Excel VBA 中.Delete 和.Clear 的区别?

    有什么区别Worksheets 1 Cells Delete and Worksheets 1 Cells Clear 我问这个是因为我一直用 Clear清除我的工作表内容 但在我之前的帖子中我发现Worksheets 1 Cells De
  • 函数名前的星号有什么作用?

    我对在大多数具有我不熟悉的函数声明的 C 程序中看到的内容感到困惑 void func name void param 什么是 暗示该功能 我的理解 在变量类型中的特点是它创建一个指向另一个变量的指针 因此它可以跟踪后一个变量存储在内存中的
  • 在不同的函数中调用变量而不使用全局变量

    我试图在另一个函数中定义的函数中使用变量 列表 而不将其设置为全局 这是我的代码 def hi hello 1 2 3 print hello def bye hello print hello hi bye hello 目前我收到错误 b
  • Oracle ODP.net 托管驱动程序与非托管驱动程序

    托管和非托管 Oracle ODP Net 驱动程序之间是否存在任何性能基准 即 除了架构 部署简单性之外 迁移到托管驱动程序是否有任何优势 我想分享一些结果 我认为与部署的简便性相比 性能上的小缺陷是值得的 Note seg意味着秒 对于
  • 使用 SQL 序数位置表示法的好处?

    背景资料 序数位置表示法 又称序数 是基于列列表中的列顺序的列简写 SELECT子句 而不是列名或列别名 通常支持在ORDER BY子句 某些数据库 MySQL 3 23 PostgreSQL 8 0 支持语法GROUP BY条款也是如此
  • Oracle中如何检测4字节UTF8字符

    我们已经看到oracle中存储了4字节的UTF 8字符 我们需要检测特定列中有多少行包含此类字符 尝试了这里给出的建议 UTF 16 补充字符 https stackoverflow com questions 34720830 how t
  • 插入现有表时出现异常 ORA-00942: 表或视图不存在

    当尝试将一批行插入现有表时 我遇到了异常 ORA 00942 表或视图不存在 我可以确认该表存在于数据库中 并且我可以使用 oracle 将数据插入到该表中 sql 开发人员 但是当我尝试在java中使用preparedstatement插
  • Scala Array.apply 有何魔力

    来自 scala 2 10 4 的 array scala Array定义为 final class Array T length Int extends java io Serializable with java lang Clonea
  • 如何在TOAD的DataGrid中显示sys_refcursor数据

    请我需要帮助 我搜索了很多并且变得更加困惑 我使用 Toad 9 7 25 并且我做了这个程序 在一个包中 PROCEDURE ReportaCC pfcorte IN DATE lcursor IN OUT SYS REFCURSOR I
  • 递归 SQL 给出 ORA-01790

    使用 Oracle 11g 第 2 版 以下查询给出 ORA 01790 表达式必须与相应表达式具有相同的数据类型 with intervals time interval AS select trunc systimestamp from
  • PHP:将字符串分成 8 个块,我该怎么做?

    我基本上有二进制 假设它的长度是300 我如何将它分割 就像使用爆炸一样 成 8 位块 我查看了 chunk split 但它似乎只有一个 end 参数 而不是将其放入数组的选项 或者它可以插入数组吗 末尾 8 位数字可以低于 8 如果有人
  • 为什么 IsAssignableFrom() 不适用于 int 和 double?

    这是错误的 typeof double IsAssignableFrom typeof int 这是错误的 typeof int IsAssignableFrom typeof double 但这有效 double a 1 0 int b
  • 无法将新地址分配给函数中的指针? [复制]

    这个问题在这里已经有答案了 不久前 我有一个编程作业 偶然发现了这个小问题 当我给一个函数一个指针作为参数时 我无法更改它指向的地址 我通过返回我想要指针指向的新地址解决了这个问题 但我仍然想知道为什么不可能操作指针参数 因为所有内存分配函
  • Oracle 中的 SQL 调优 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何文章 链接可以让我找到 SQL 调优 Oracle 的示例 如果能用例子来解释那就太好了 我需
  • 如何为键盘上的 xml 中的功能键设置不同的背景?

    我正在开发 Android 键盘应用程序 我尝试为普通键和功能键设置不同的背景 但它不起作用

随机推荐

  • 使用 gradle 出现“文件名或扩展名太长错误”

    我最近更新了我的代码 当我尝试使用运行我们的应用程序时g 启动运行在命令行中 我遇到了这个错误 堆栈跟踪 org gradle api tasks TaskExecutionException Execution failed for ta
  • C++ 语言中不允许零长度数组或 sizeof == 0 的理由是什么?

    C 标准要求所有类型的大小至少为 1 个字节 即使结构体没有成员也是如此 IE struct x but sizeof x 1 数组也是如此 声明零长度数组 在 C C 和 C99 中 不符合标准 int x 0 not allowed i
  • @LazyCollection(LazyCollectionOption.FALSE) 和 @OneToMany(fetch = FetchType.EAGER) 之间的区别

    我对 延迟加载 有一个疑问 使用有什么区别 LazyCollection LazyCollectionOption FALSE and OneToMany fetch FetchType EAGER 在我的应用程序中 我使用两个列表 但如果
  • Eclipse 内的 Tomcat 覆盖上下文片段

    我有一个 Eclipse 项目 它使用 WST 连接到 Tomcat 6 出于测试原因 我需要设置一些上下文参数来覆盖 web xml 中的设置 设置以下服务器选项 服务而不发布 因为我想直接从项目运行我的应用程序和 将上下文发布到单独的
  • 代理设置 Wildfly

    我有一个 Wildfly 10 应用程序服务器 上面运行着一个 Liferay 6 2 实例 并且我一直在尝试正确设置代理设置 但是 所有需要外部 Internet 连接的 Portlet 都会遇到超时 在standalone conf 文
  • silverlight客户端可以访问存储在独立存储中的本地sql紧凑数据库吗

    silverlight clr 是否支持访问位于 silverlight 应用程序的独立存储中的 sql 紧凑数据库 如果是这样 任何指向代码示例的指针 我想缓存在以前的会话中从服务器检索到的信息 即使它存储在独立存储中 在 SQL Ser
  • 序列化和反序列化 lambda

    我想在机器 A 上序列化并在机器 B 上反序列化 python lambda 这有几个明显的问题 pickle 模块不会序列化或反序列化代码 它仅序列化类 方法 函数的名称 我在 google 找到的一些答案建议使用低级 marshal 模
  • 为什么 jQuery 在 $.ajax 成功回调中吞掉异常?

    看起来 jQuery 1 6 4 故意吞掉了 ajax 成功回调中的异常 如果我这样做 get function console log doodoo 我在 Chrome 控制台中得到这个 Object doodoo 但如果我这样做的话 g
  • Conda 激活不起作用?

    gonzo a packages conda env list conda environments ppo latest nohome jaan abhishek anaconda3 envs ppo latest root nohome
  • 使用 R 计算季节性平均值的最优雅方法是什么?

    我有均匀分布的时间序列和每日平均观测数据 如何以最简单的方式计算季节性平均值 季节应遵循气象术语 DJF 冬季 十二月 一月 二月 MAM JJA 和 SON 这意味着 12 月的值来自 x 1 年 这里很好地介绍了月均值的计算 如何计算月
  • 带显示的 Span 元素:inline-flex 的高度比同级 Span 更大

    在使用 Flex 容器时 我注意到 Chrome 和 Firefox 的渲染高度都比静态同级容器高 1px 这是代码 container background color yellow border 1px solid red main b
  • 自动换行不适用于 chrome 中 fieldset 内的 div

    在linux chrome 27 0 1453 93和windows chrome 27 0 1453 94中尝试过 示例位于http jsfiddle net SruNd 4 http jsfiddle net SruNd 4 CSS m
  • 如何删除集合中的重复项?

    我在 Laravel 中有收藏 Collection 450 items array 2 0 gt Announcement 533 1 gt Announcement 553 这是相同的项目 如何删除其中之一 完整代码是 public f
  • 使用 Spring Rest 模板时 HttpConnection 的默认保持活动时间

    我想知道在通过 Spring 休息模板创建新连接之前 HttpConnection 在不活动时保持活动状态多长时间 我查看了默认的连接超时和读取超时参数 但我相信这些参数是在由于某些故障等而未建立连接时的连接超时上下文中使用的 我正在寻找的
  • 具有可逆属性的校验和/哈希函数

    我正在寻找具有以下属性的特定哈希码 我不知道任何这样的哈希码 也不知道是否可以做这样的事情 只是想把它放在那里 看看人们怎么说 我有两个数据库 宽松使用的术语 不要想到 SQL 或任何类似的东西 一个主数据库和一个备份数据库 需要保持两个数
  • javac 在 ubuntu 终端中不起作用

    当我尝试编译 java 程序时javac 我收到错误 The program javac can be found in the following packages default jdk ecj gcj 4 6 jdk gcj 4 7
  • 如何列出 Enum 的成员

    如何在代码中列出Enum的成员 我有以下枚举 Public Enum TestEnum As int32 First 0 Second 2 Third 4 Fourth 6 End Enum 我尝试通过以下代码列出 TestEnum 的所有
  • 如何将 MediaBrowserService 与小部件一起使用?

    我的服务扩展了 MediaBrowserService 类 它响应某些 MediaController 操作 例如getMediaController getTransportControls onPlay 但是 我没有找到从 Widget
  • 安装的构建工具修订版 30.0.3 已损坏

    当我构建 Android 应用程序时 出现错误 已安装的构建工具修订版 30 0 3 已损坏 使用 SDK 管理器删除并再次安装 我尝试通过更新 sdk 管理器来修复此问题 但它不起作用 我该如何修复这个错误 尝试安装稳定版SDK 构建工具
  • 在 Oracle 对象类型构造函数中设置默认值

    我想在 Oracle 对象类型中设置默认值 但它要求所有属性都需要在构造函数中传递 无论如何 这样我就可以在构造函数中仅传递需要默认值的必需属性 请参阅以下详细信息 SQL gt CREATE TYPE TYPE SUB AS OBJECT