如何在返回 SELF 的函数的 pl/sql 对象类型中链接调用

2024-01-13

我想让一个 oracle 对象返回自身并能够链接这些调用。我怎么做?

我尝试返回相同的类型,但它不起作用,我还尝试添加一个由函数调用的过程,但它也不起作用。总是抱怨修改宽度成员的值。看起来函数不会产生副作用?它们是按照更数学的函数原理建模的吗?这可以实现吗?我想我可以编写这个函数,以便它用 SELF 构建一个新的矩形,但工作量太大了。

我的目标是能够像 jQuery 或一些 java 类(单例?)一样链接调用。就像是:

r := r.setWidth(0).setWidth(1).setWidth(2);

当然,它会有更多的方法,而且它不会是一个矩形。这是错误:

Error: PLS-00363: expression 'SELF' cannot be used as an assignment target
Line: 18
Text: stWidth(w);

-

CREATE OR REPLACE TYPE rectangle AS OBJECT
(
-- The type has 3 attributes.
  length NUMBER,
  width NUMBER,
  area NUMBER,
-- Define a constructor that has only 2 parameters.
  CONSTRUCTOR FUNCTION rectangle(length NUMBER, width NUMBER)
    RETURN SELF AS RESULT,
  MEMBER FUNCTION setWidth(w NUMBER) RETURN rectangle,
  MEMBER PROCEDURE stWidth(w NUMBER)
)

-

CREATE OR REPLACE TYPE BODY rectangle AS
  CONSTRUCTOR FUNCTION rectangle(length NUMBER, width NUMBER)
    RETURN SELF AS RESULT
  AS
  BEGIN
    SELF.length := length;
    SELF.width := width;
-- We compute the area rather than accepting it as a parameter.
    SELF.area := length * width;
    RETURN;
  END;
  MEMBER PROCEDURE stWidth(w NUMBER) IS
  BEGIN
    self.width := w;
  END;
  MEMBER FUNCTION setWidth(w NUMBER) RETURN rectangle IS
    BEGIN
        stWidth(w);

        RETURN SELF;
  END;
END;

提前致谢。


您不能同时更改对象并为其分配。您已经知道解决方案,“用 SELF 构建一个新矩形”。但这不会有很多工作。

替换这个:

  MEMBER FUNCTION setWidth(w NUMBER) RETURN rectangle IS
    BEGIN
        stWidth(w);
        RETURN SELF;
  END;

有了这个:

  MEMBER FUNCTION setWidth(w NUMBER) RETURN rectangle IS
      v_rectangle rectangle := self;
    BEGIN
        v_rectangle.width := w;
        RETURN v_rectangle;
  END;

您实际上遇到了编译错误。默认情况下,SELF is an IN范围。致电给stWidth失败,因为它正在修改IN参数与self.width := w;.

See: http://docs.oracle.com/cd/B28359_01/appdev.111/b28371/adobjbas.htm#CHDCFEEE http://docs.oracle.com/cd/B28359_01/appdev.111/b28371/adobjbas.htm#CHDCFEEE

SELF 始终是传递给该方法的第一个参数。

  • 在成员函数中,如果没有声明SELF,其参数模式 默认为 IN。

  • 在成员过程中,如果没有声明SELF,其参数模式 默认为输入输出。默认行为不包括 NOCOPY 编译器提示。

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

如何在返回 SELF 的函数的 pl/sql 对象类型中链接调用 的相关文章

随机推荐

  • 如何使用 C++ 中具有多个参数的 if 语句调用多个函数

    该程序针对每种条件运行所有函数 而它应该只针对每种条件运行一个函数 为什么 我应该编写计算球体 圆柱体和圆锥体的体积和表面积的函数 我无法弄清楚是 if 语句弄乱了 还是函数本身弄乱了 该程序的理想输出如下 选择形状 1 球体 2 圆柱体
  • 从 node-mysql 连接到 Amazon RDS (MySQL) 时出错

    我正在尝试使用 felixge node mysql 包从 Lambda 中托管的 Nodejs 代码连接到我的 Amazon RDS MySQL 实例 我需要帮助来找出我做错了什么 我收到 连接 ETIMEDOUT 错误 我的代码托管在
  • 不同源文件中的 D 模板特化

    我最近问this https stackoverflow com questions 6328444 type classes in d有关如何在 D 中模拟类型类的问题 并建议了一种使用模板专业化来实现此目的的方法 我发现 D 无法识别不
  • 基于不同XAML的样式继承

    如何将样式中的 BasedOn 标记指定为在其他文件中定义的样式 Example Dictionary1 xaml 定义 在 Dictionary2 xaml 中我需要类似的东西
  • 从 pandas 数据框中删除闰年日

    我有福尔 数据框 datetime 2012 01 01 125 5010 2012 01 02 125 5010 2012 01 03 125 5010 2012 02 04 125 5010 2012 02 05 125 5010 20
  • 我是否需要担心“Rc”的开销?

    我是否正确地假设唯一 放慢速度 的事情Rc问题是它会在对象删除时检查是否释放该对象 除此之外 取消引用的开销是 多少 Rc 即我应该关心它吗 这两个函数几乎同样快吗 或者说速度上有明显的区别吗 fn test with box let b
  • 日志记录和同步

    我刚刚编写了自己的日志框架 非常轻量级 不需要大型日志框架 它由一个接口 ILogger 和许多实现该接口的类组成 我有一个问题是 TGUILogger 它采用 TStrings 作为日志记录目标 并将日志记录与主线程同步 以便列表框的 I
  • Linux 中如何给线程命名? [复制]

    这个问题在这里已经有答案了 我有一个用 C C 编写的多线程 Linux 应用程序 我有为我的线程选择名称 https stackoverflow com questions 149932 naming conventions for th
  • Java正则表达式跳过匹配

    我有一些文字 我想提取不以标点符号分隔的单词对 这是代码 n grams Pattern p Pattern compile a z if n 2 p Pattern compile a z a z if n 3 p Pattern com
  • 如何在supervisor中添加延迟到受监督进程 - linux

    我添加了一个使用 python cassandra 库的 Bottle 服务器 但它存在以下错误 Bottle FATAL Exited too quickly process log may have details 日志显示 File
  • Android JNI 本机 C 函数调用杀死活动

    什么有效 我有一个运行 TUN TAP 服务的 c 可执行文件 以及两个在终端中运行良好的 shell 脚本 用于配置 ip 路由 和 iptables 全部以 root 身份运行 什么不起作用 我正在尝试创建一个 Android 应用程序
  • 如何在 Python 中提取字符串中的列表?

    我使用 Pandas 导入了 CSV 并用字符串条目读入了一列 检查本系列 专栏 的条目 我发现它们实际上应该是列表 例如 df A pd Series entry11 entry21 entry22 entry31 entry32 我想从
  • Windows批处理文件中的一个数字既大于又小于另一个

    我的批处理文件中有以下代码 if bakfilesize geq freespacet echo baksize is larger if bakfilesize leq freespacet echo baksize is smaller
  • 如何在服务生成器类中添加http拦截器

    我创建了一个单独的服务生成器类 如本指南所示https futurestud io tutorials retrofit 2 manage request headers in okhttp interceptor https future
  • 如何将 CSRF 令牌设置为不同的上下文路径

    我们基于 Angular 的 Web 应用程序与在不同域和上下文路径上运行的企业门户集成 我正在使用基于 Spring Security 的 CSRF 令牌来验证传入请求 该应用程序在本地完美运行 但当我将其与门户集成时 所有 post 调
  • pg_dump 串行数据类型问题

    有人可以向我解释一下为什么使用以下脚本创建 PostgreSQL 表 CREATE TABLE users id serial NOT NULL name character varying 150 NOT NULL surname cha
  • 开发 API - 如何确保其安全? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我将读取和写入方法放在数据库中 并通过 URL 公开它们 我使用 CodeIgniter 框架并使用 URL 段将参数传递给这些方法
  • 将文件复制到 FTP 并以今天的日期存档

    我需要创建一个执行以下操作的脚本 将文件夹中的所有文件复制到 FTP 站点 如果复制成功 则将文件移至存档 存档应该是一个新创建的文件夹 具有今天的日期 这样我们就知道它们何时被传输 我试图蚕食其他脚本来让某些东西发挥作用 但我没有取得任何
  • docker ubuntu /bin/sh: 1: locale-gen: 未找到

    我将下面的区域设置代码放入我的 dockerfile 中 FROM node 4 onbuild Set the locale RUN locale gen en US UTF 8 ENV LANG en US UTF 8 ENV LANG
  • 如何在返回 SELF 的函数的 pl/sql 对象类型中链接调用

    我想让一个 oracle 对象返回自身并能够链接这些调用 我怎么做 我尝试返回相同的类型 但它不起作用 我还尝试添加一个由函数调用的过程 但它也不起作用 总是抱怨修改宽度成员的值 看起来函数不会产生副作用 它们是按照更数学的函数原理建模的吗