oracle 9i 中的动态声明/查询

发布于 2024-10-08 04:25:47 字数 251 浏览 7 评论 0原文

在 Oracle 中,给定一个表名列表,我想对大量表执行“select column1 into var1 from table”语句。我想对表的所有列执行此操作。在使用 user_tab_columns 的查询返回列的类型之前,我无法声明 var1 的类型。我尝试将 var1 声明为 sys.anytype,但收到 ORA-00932,并显示错误消息,例如“数据类型不一致:预期的 CHAR 为 CHAR”。

那么我该如何克服这个错误或者如何动态声明变量呢?非常感谢。

In Oracle, given a list of table names, I want to perform 'select column1 into var1 from table' statements on a mass number of tables. And I want to do this for all columns of a table. I cannot declare the type of var1 until the query with user_tab_columns returns the column's type. I tried to declare var1 as sys.anytype but got ORA-00932 with error message such as "inconsistent datatypes: expected CHAR got CHAR".

So how can I get past this error or how can I dynamically declare a variable? Many thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

国际总奸 2024-10-15 04:25:47

大多数数据类型都会隐式转换为 VARCHAR。显然也有例外,但如果你的表只是 varchars、日期和数字那么你应该没问题。

Most datatypes will implicitly convert into a VARCHAR. Obviously there are exceptions, but if your tables are just varchars, dates, and numbers then you should be fine.

清浅ˋ旧时光 2024-10-15 04:25:47

克雷格是对的,你应该将其声明为 VARCHAR2 而不是任何类型。

Jeff Hunter 的这篇文章有一个很好的函数,可以让这一切变得简单以在数据无法转换时不会中断的方式填充变量。

CREATE OR REPLACE FUNCTION getData(data IN SYS.ANYDATA)
    RETURN VARCHAR2
    AS
      l_varchar2   VARCHAR2(4000);
      l_rc         NUMBER;
    BEGIN

      CASE data.getTypeName
        when 'SYS.NUMBER' then
          l_rc := data.getNumber(l_varchar2);
        when 'SYS.DATE' then
          l_rc := data.getDate(l_varchar2);
        when 'SYS.VARCHAR2' then
          l_rc := data.getVarchar2(l_varchar2);
        else
          l_varchar2 := '** unknown **';
      END CASE;

      RETURN l_varchar2;

    END;

Craig is right you should probably declare it as a VARCHAR2 instad of an anytype.

This article by Jeff Hunter has a nice function that makes this easy to populate your variable in way that won't break if your data can't be converted.

CREATE OR REPLACE FUNCTION getData(data IN SYS.ANYDATA)
    RETURN VARCHAR2
    AS
      l_varchar2   VARCHAR2(4000);
      l_rc         NUMBER;
    BEGIN

      CASE data.getTypeName
        when 'SYS.NUMBER' then
          l_rc := data.getNumber(l_varchar2);
        when 'SYS.DATE' then
          l_rc := data.getDate(l_varchar2);
        when 'SYS.VARCHAR2' then
          l_rc := data.getVarchar2(l_varchar2);
        else
          l_varchar2 := '** unknown **';
      END CASE;

      RETURN l_varchar2;

    END;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文