天道酬勤,学无止境

Is using a SELECT inside a pipelined PL/SQL table function allowed?

The docs for pipelined functions say that DML is not allowed when they are used in a SQL statement (typically a SELECT), and in most examples the pipelined functions are used for data generation or transformation (accepting a custor as parameter), but not issuing any DML statements.

Now, technically, it is possible to use SELECTs without any error from Oracle (ORA 14551 will not occur). However, I have experiences reproducible strange behavior of the select; even though PRAGMA AUTONOMOUS_TRANSACTION is not being used, the rows retrieved by the SELECT seem not always taking the current local transaction into account, which feels like a bug to me. Even more disturbing is the fact that, when using a distributed transaction (for instance via ORAMTS instead of a local transaction), the transaction is used.

Edit: As it turns out, the strange effect seems related to some WITH statements in the query, which sometimes work and sometimes not (depending on the current mood of the Oracle optimizer, at least in 10g). In some cases, I get a ORA-32036, then again it doesn't occur, without changing the code at all. Now it looks as if the queries which sometimes fail with the ORA-32036 are the ones which also fail to use the correct transaction, and it may be unrelated to the pipelined function.

So my specific questions are:

  • Is there any, preferably official, statement whether SELECTs in pipelined table functions are allowed and what their transactional context is?

  • Is there another way of modularizing commonly used queries which can be used in SQL statements (just as table functions can with TABLE())?

  • Has anyone also experienced such behavior and does maybe know more about it? I've looked into metalink, but unfortunately I didn't find anything specific on the topic.

评论

  1. usually DML restrictions only concern modification (UPDATE, DELETE ...) statements so SELECT should be OK. I'll try to find a specific statement from Oracle.

  2. Views would be your first tool to modularize commonly-used queries.

  3. Functions have a drawback over views : if they are called from another SELECT they are not executed at the same point-in-time as the main SELECT. Each call to a SELECT is consistent but since the SELECT are in the function code and not in the main SQL you may return inconsistent results. This is not possible with views and sub-select: if a big statement call a view the view is built at the same point-in-time as the main query.

Update: regarding your comment about parameterized queries

You can build parameterized views, that is views that are dependent upon variables set before execution. Here is an example on AskTom showing how you could do it with userenv('client_info') or dbms_session.set_context.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Oracle查询以查找字符串中所有出现的字符(Oracle query to find all occurrences of a charcter in a string)
    问题 我必须在蟾蜍中编写一个Oracle查询,以查找字符串中所有出现的字符。 例如,如果我在字符串SSSRNNSRSSR搜索R ,它将返回位置4、8和11。 我是Oracle的新手,并尝试了此方法。 select instr(mtr_ctrl_flags, 'R', pos + 1, 1) as pos1 from mer_trans_reject where pos in ( select instr(mtr_ctrl_flags, 'R', 1, 1) as pos from mer_trans_reject ); 其中mtr_ctrl_flags是列名。 我收到一条错误消息,指示pos是无效的标识符。 回答1 扩展GolezTrol的答案,您可以使用正则表达式来显着减少您执行的递归查询的数量: select instr('SSSRNNSRSSR','R', 1, level) from dual connect by level <= regexp_count('SSSRNNSRSSR', 'R') REGEXP_COUNT()返回模式匹配的次数,在这种情况下, R在SSSRNNSRSSR存在的SSSRNNSRSSR 。 这将递归级别限制为所需的确切数量。 INSTR()只是在字符串中搜索R的索引。 level是递归的深度,但是在这种情况下,它也是字符串的第th次出现
  • PL/SQL - 如何在 IN 子句中使用数组(PL/SQL - How to use an array in an IN Clause)
    问题 我试图在 IN 子句中使用我的过程的输入值数组作为游标的 where 子句的一部分。 我知道以前有人问过这个问题,但我还没有看到如何正确编译我的语法。 在包规范中,类型是 TYPE t_brth_dt IS TABLE OF sourceTable.stdt_brth_dt%TYPE INDEX BY PLS_INTEGER; sourceTable.std_brth_dt是表中的日期列。 我的光标的简化版本在包体中是 - cursor DataCursor_Sort( p_brth_dt in t_brth_dt) is SELECT * FROM sourceTable WHERE a.brth_dt IN (select column_value from table(p_brth_dt)) 当我尝试编译它时,出现以下错误。 [1]:(错误):PLS-00382:表达式类型错误 [2]:(错误):PL/SQL:ORA-22905:无法访问来自非嵌套表项的行 我知道这看起来与其他问题相似,但我不明白语法错误是什么。 回答1 为了在查询的from子句中使用定义为嵌套表或关联数组的集合,您应该,正如@Alex Poole 正确指出的那样,创建一个模式级别 (SQL) 类型或使用一个可供您使用的类型通过ODCIConst包 - odcidatelist因为您打算使用日期列表。
  • Oracle PL / SQL-立即输出/控制台打印的提示(Oracle PL/SQL - tips for immediate output / console printing)
    问题 我有许多pl / sql过程,可能需要几分钟才能运行。 在开发它们时,我添加了一些打印语句以帮助调试并提供一些反馈和进度指示器。 最初,我在小型测试仪上运行这些程序,并且输出几乎是瞬时的。 现在,我正在使用较大的测试集进行测试,该测试集需要花费几分钟才能运行,我发现不再适合打印到控制台,因为在过程结束之前不会打印任何内容。 我习惯于在不缓冲其输出并立即打印输出的环境中工作,并且添加用于简单调试和诊断的简单打印语句是很常见的。 是否可以在pl / sql中立即打印输出(未缓冲)? 如果没有,人们建议采用哪些替代方法以获得相似的结果? 回答1 您可以有一个使用自主事务将消息写到表的过程,例如: procedure log (p_message) is pragma autonomous_transaction; begin insert into message_log (user, datetime, message) values (user, sysdate, p_message); commit; end; 然后从另一个Oracle会话监视表。 回答2 为此,我们有一个小技巧。 您可以使用DBMS_APPLICATION_INFO.set_client_info(“这里的一些信息”); 创建一些变量并替换“”内的字符串。 并使用v $ session中的select
  • 如何从存储过程返回多行? (Oracle PL / SQL)(How to return multiple rows from the stored procedure? (Oracle PL/SQL))
    问题 我想用一个参数创建一个存储过程,该存储过程将根据参数返回不同的记录集。 有什么办法做到这一点? 我可以从普通SQL中调用它吗? 回答1 这是如何构建一个函数,该函数返回可以查询的结果集,就好像它是一个表一样: SQL> create type emp_obj is object (empno number, ename varchar2(10)); 2 / Type created. SQL> create type emp_tab is table of emp_obj; 2 / Type created. SQL> create or replace function all_emps return emp_tab 2 is 3 l_emp_tab emp_tab := emp_tab(); 4 n integer := 0; 5 begin 6 for r in (select empno, ename from emp) 7 loop 8 l_emp_tab.extend; 9 n := n + 1; 10 l_emp_tab(n) := emp_obj(r.empno, r.ename); 11 end loop; 12 return l_emp_tab; 13 end; 14 / Function created. SQL> select * from table
  • 在PL / SQL存储过程中分割逗号分隔的字符串(Splitting comma separated string in a PL/SQL stored proc)
    问题 我有CSV字符串100.01,200.02,300.03,需要将其传递给Oracle中的PL / SQL存储过程。 在proc内部,我需要将这些值插入表格的Number列中。 为此,我从这里得到了一种可行的方法: 如何在oracle 9i中最佳拆分csv字符串 [2)按级别使用SQL的连接。]。 现在,我还有另一个要求。 我需要传递2个[等长] CSV字符串作为PL / SQL存储过程的输入。而且,我需要打破这个字符串并将两个CSV字符串中的每个值插入表中的两个不同列中。知道该怎么做吗? CSV输入示例:mystring varchar2(2000):='0.75,0.64,0.56,0.45'; myAmount varchar2(2000):='0.25,0.5,0.65,0.8'; myString值将进入表的A列,而myAmount值将进入表的B列。 您能否让我知道如何实现这一目标? 谢谢。 回答1 这应该可以满足您的要求。.假设您的列表始终只是数字。 如果不是这种情况,只需将对DBMS_SQL.NUMBER_TABLE的引用更改为适用于所有数据的表类型: CREATE OR REPLACE PROCEDURE insert_from_lists( list1_in IN VARCHAR2, list2_in IN VARCHAR2, delimiter_in IN
  • 是否可以从PL / SQL块输出SELECT语句?(Is it possible to output a SELECT statement from a PL/SQL block?)
    问题 如何获得PL / SQL块以输出SELECT语句的结果,就像执行普通的SELECT ? 例如,如何执行SELECT : SELECT foo, bar FROM foobar; 暗示 : BEGIN SELECT foo, bar FROM foobar; END; 不起作用。 回答1 这取决于您需要的结果。 如果确定只有1行,请使用隐式游标: DECLARE v_foo foobar.foo%TYPE; v_bar foobar.bar%TYPE; BEGIN SELECT foo,bar FROM foobar INTO v_foo, v_bar; -- Print the foo and bar values dbms_output.put_line('foo=' || v_foo || ', bar=' || v_bar); EXCEPTION WHEN NO_DATA_FOUND THEN -- No rows selected, insert your exception handler here WHEN TOO_MANY_ROWS THEN -- More than 1 row seleced, insert your exception handler here END; 如果要选择多于1行,则可以使用一个显式游标: DECLARE CURSOR cur
  • PL / SQL-IN CLAUSE中的逗号分隔列表(PL/SQL - comma separated list within IN CLAUSE)
    问题 我在获取pl / sql代码块的工作时遇到麻烦。 在过程的顶部,我从oracle apex应用程序中获取了有关选中了哪些复选框的数据。 由于包含复选框的报告是动态生成的,因此我必须遍历 APEX_APPLICATION.G_F01 列出并生成一个逗号分隔的字符串,如下所示 v_list VARCHAR2(255) := (1,3,5,9,10); 我想稍后再查询该列表,然后将v_list放在IN子句中,如下所示 SELECT * FROM users WHERE user_id IN (v_list); 这当然会引发错误。 我的问题是我可以将v_list转换为什么以便能够将其插入到pl / sql过程中的查询的IN子句中? 回答1 如果users很小,并且user_id不包含逗号,则可以使用: SELECT * FROM users WHERE ',' || v_list || ',' LIKE '%,'||user_id||',%' 尽管此查询不是最佳查询,因为它不能使用user_id索引。 我建议您使用流水线函数,该函数返回可以直接查询的NUMBER表。 例如: CREATE TYPE tab_number IS TABLE OF NUMBER; / CREATE OR REPLACE FUNCTION string_to_table_num(p VARCHAR2)
  • 如何在SELECT FROM语句中使用表类型?(How to use a table type in a SELECT FROM statement?)
    问题 这个问题或多或少与此相同 在包头中: 声明以下行类型: TYPE exch_row IS RECORD( currency_cd VARCHAR2(9), exch_rt_eur NUMBER, exch_rt_usd NUMBER); 并且此表类型: TYPE exch_tbl IS TABLE OF exch_row INDEX BY BINARY_INTEGER; 添加了一个变量: exch_rt exch_tbl; 在包体内: 用一些数据填充该表变量。 在程序包主体中的过程中: 我想使用以下语句: CURSOR c0 IS SELECT i.*, rt.exch_rt_eur, rt.exch_rt_usd FROM item i, exch_rt rt WHERE i.currency = rt.exchange_cd 在Oracle中如何做到这一点? 笔记 实际上,我正在寻找MSSQL中的“表变量”解决方案: DECLARE @exch_tbl TABLE ( currency_cd VARCHAR(9), exch_rt_eur NUMBER, exch_rt_usd NUMBER) ) 并在我的StoredProcedure中使用此表变量。 回答1 在SQL中,您只能使用在架构级别定义的表类型(而不是在包或过程级别),并且不能在架构级别定义按表索引(关联数组)
  • PL/SQL - execute immediate in pipelined function
    I want to execute dynamic query in my pipelined function and return results of this query. Is it possible to do this? Pipelined function is convenient for me to achieve good interface for my application cause it behaves like a table. The function: CREATE OR REPLACE FUNCTION MyFunction(p_schema VARCHAR2) RETURN MyTableType Pipelined IS v_query VARCHAR2(1000); BEGIN v_query := 'SELECT * FROM TABLE ('||p_schema||'.somepackage.SomeFunction)'; --SomeFunction is another pipelined function EXECUTE IMMEDIATE v_query; --Results of the v_query are compatible with MyTableType's row type. But how to
  • 具有批量集合的表函数抛出无效的数据类型(Table function with bulk collection throws invalid datatype)
    问题 我正在写一个函数,我想用表函数包装它,以便可以与选择查询一起使用。 这是我的类型声明和函数的某些行 CREATE OR REPLACE PACKAGE TYPES AS TYPE CURSORTYPE IS REF CURSOR; TYPE vbugsrec IS RECORD ( bug_id bugs.bug_id%TYPE, facility bugs.facility%TYPE ); TYPE vbugstable IS TABLE OF vbugsrec INDEX BY BINARY_INTEGER; END; / CREATE OR REPLACE PACKAGE BODY CustomQueries AS FUNCTION pendverifylist (myldapid IN userpass.ldapalias%TYPE, maxrows IN PLS_INTEGER:= CustomQueries.maxrecords) RETURN types.vbugstable IS datarows types.vbugstable; var_useralias userpass.ldapalias%TYPE := UPPER (pendverifylist.myldapid) ; CURSOR pendverify_cur ( cursor_var_alias
  • 是否有在PL / SQL中拆分字符串的功能?(Is there a function to split a string in PL/SQL?)
    问题 我需要编写一个过程来规范化具有由一个字符连接的多个令牌的记录。 我需要获得这些令牌来分割字符串,并将每个令牌作为新记录插入表中。 Oracle是否具有类似“拆分”功能的功能? 回答1 你必须自己动手。 例如, /* from :http://www.builderau.com.au/architect/database/soa/Create-functions-to-join-and-split-strings-in-Oracle/0,339024547,339129882,00.htm select split('foo,bar,zoo') from dual; select * from table(split('foo,bar,zoo')); pipelined function is SQL only (no PL/SQL !) */ create or replace type split_tbl as table of varchar2(32767); / show errors create or replace function split ( p_list varchar2, p_del varchar2 := ',' ) return split_tbl pipelined is l_idx pls_integer; l_list varchar2
  • ORA-22905-使用select语句查询表类型时(ORA-22905 - when querying a table type with a select statement)
    问题 DECLARE TYPE record_AB IS RECORD ( AA VARCHAR2 (16 BYTE), BB VARCHAR2 (16 BYTE) ); TYPE type_tab_AB IS TABLE OF record_AB INDEX BY BINARY_INTEGER; tab_AB type_tab_AB; BEGIN SELECT * BULK COLLECT INTO tab_AB FROM... .. SELECT * FROM TABLE (tab_AB) ; 当它从TABLE语句进入SELECT时,出现“ ORA-22905:无法访问非嵌套表项中的行”的信息。 甚至可以在PLSQL中查询表类型吗? 回答1 可以查询PL / SQL中的表类型,但只能查询其类型在架构级别(即PL / SQL外部)声明的嵌套表和varray。 错误 ORA-22905:无法访问非嵌套表项中的行 表示您正在尝试从不受支持的表类型中查询。 由于INDEX BY BINARY_INTEGER子句,您的type_tab_AB类型是一个关联数组。 删除INDEX BY BINARY_INTEGER子句,使type_tab_AB成为嵌套表类型。 (varrays也可以在这里工作,但是除非您知道预期的行数上限,否则我不建议您使用它们。声明varray类型时,您需要指定最大元素数
  • PLSQL Developer软件使用大全
    PLSQL Developer软件使用大全 第一章 PLSQL Developer特性PL/SQL Developer是一个集成开发环境,专门面向Oracle数据库存储程序单元的开发。如今,有越来越多的商业逻辑和应用逻辑转向了Oracle Server,因此,PL/SQL编程也成了整个开发过程的一个重要组成部分。PL/SQL Developer侧重于易用性、代码品质和生产力,充分发挥Oracle应用程序开发过程中的主要优势。PL/SQL Developer主要特性:PL/SQL编辑器,功能强大——该编辑器具有语法加强、SQL和PL/SQL帮助、对象描述、代码助手、编译器提示、PL/SQL完善、代码内容、代码分级、浏览器按钮、超链接导航、宏库等许多智能特性,能够满足要求性最高的用户需求。当您需要某个信息时,它将自动出现,至多单击即可将信息调出。集成调试器(要求Oracle 7.3.4或更高)——该调试器提供您所需要的全部特性:跳入(Step In)、跳过(Step Over)、跳出(Step Out)、异常时停止运行、断点、观察和设置变量、观察全部堆栈等。基本能够调试任何程序单元(包括触发器和Oracle8 对象类型),无需作出任何修改。PL/SQL完善器——该完善器允许您通过用户定义的规则对SQL和PL/SQL代码进行规范化处理。在编译、保存、打开一个文件时,代码将自动被规范化
  • 您可以选择所有内容,但不选择1或2个字段,而无需作家的抽筋吗?(Can you SELECT everything, but 1 or 2 fields, without writer's cramp?)
    问题 在PLSQL中,是否可以选择表中除1或2以外的所有字段,而不必指定所需的字段? 例如,employee表具有以下字段: ID 名姓爱好 是否仍然可以编写类似于以下内容的查询 select * from employee 而不必像写这样的东西就离开了hobbies呢? select id, firstname, lastname from employee 回答1 否-您将获得所有字段(*)或指定所需的字段。 回答2 如果要避免编写者的抽筋,可以使用SQL Developer并让它为您生成列列表: select column_name||',' from all_tab_columns where table_name = 'YourTableName' 然后,只删除不需要的一两列。 您也可以使用 SELECT listagg(column_name, ',') within group (order by column_name) columns FROM all_tab_columns WHERE table_name = 'TABLE_NAME' GROUP BY table_name; 回答3 是一个旧线程,但是,是的……在Oracle中有一种方法可以做到: with employee(id, firstname, lastname, hobbies) as (
  • ​ PLSQL Developer软件使用大全
    PLSQL Developer软件使用大全 第一章 PLSQL Developer特性PL/SQL Developer是一个集成开发环境,专门面向Oracle数据库存储程序单元的开发。如今,有越来越多的商业逻辑和应用逻辑转向了Oracle Server,因此,PL/SQL编程也成了整个开发过程的一个重要组成部分。PL/SQL Developer侧重于易用性、代码品质和生产力,充分发挥Oracle应用程序开发过程中的主要优势。PL/SQL Developer主要特性:PL/SQL编辑器,功能强大——该编辑器具有语法加强、SQL和PL/SQL帮助、对象描述、代码助手、编译器提示、PL/SQL完善、代码内容、代码分级、浏览器按钮、超链接导航、宏库等许多智能特性,能够满足要求性最高的用户需求。当您需要某个信息时,它将自动出现,至多单击即可将信息调出。集成调试器(要求Oracle 7.3.4或更高)——该调试器提供您所需要的全部特性:跳入(Step In)、跳过(Step Over)、跳出(Step Out)、异常时停止运行、断点、观察和设置变量、观察全部堆栈等。基本能够调试任何程序单元(包括触发器和Oracle8 对象类型),无需作出任何修改。PL/SQL完善器——该完善器允许您通过用户定义的规则对SQL和PL/SQL代码进行规范化处理。在编译、保存、打开一个文件时,代码将自动被规范化
  • ORACLE SQL:获取两个数字之间的所有整数(ORACLE SQL:Get all integers between two numbers)
    问题 在Oracle中,有什么方法可以选择包含在两个数字之间的数字(整数); 我不想创建PL / SQL过程或函数。 例如,我需要获取3到10之间的数字。结果将是值3,4,5,6,7,8,9,10。 谢谢。 回答1 Oracle DUAL表的这一技巧也适用: SQL> select n from 2 ( select rownum n from dual connect by level <= 10) 3 where n >= 3; N ---------- 3 4 5 6 7 8 9 10 回答2 创建新数据库时,我要做的第一件事是创建并填充一些基本表。 一个是-N到N之间所有整数的列表,另一个是过去5年到将来10年之间的日期列表(计划的作业可以根据需要继续创建这些日期,向前移动),最后一个是列表全天的所有时间。 例如,inetgers: create table numbers (n integer primary key); insert into numbers values (0); insert into numbers select n+1 from numbers; commit; insert into numbers select n+2 from numbers; commit; insert into numbers select n+4 from
  • Pl/SQL- 从查询中获取列名(Pl/SQL- Get column names from a query)
    问题 我在 Oracle 数据库 11g 中使用 Pl/SQL。 我正在编写一个将 select 语句作为参数 (varchar2) 的函数。 该函数使用 for 循环遍历行并将格式应用于特定列,并输出整个内容。 基本上,我需要某种方法来获取列名,以便我可以将它们显示在顶部。 我知道有多种方法可以对表执行此操作,但是由于传入了此查询,因此可能尚未选择所有列,可能已使用别名等。 有没有办法可以从此查询中选择列名? 理想情况下是这样的: select column_names from (subquery) 回答1 我相信你可以使用 DESCRIBE_COLUMNS 来做到这一点。 只需传入游标和其他必需的参数。 http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_sql.htm#i1026120 declare v_sql varchar2(32767) := 'select 1 column1, 2 column2 from dual'; v_cursor_id integer; v_col_cnt integer; v_columns dbms_sql.desc_tab; begin v_cursor_id := dbms_sql.open_cursor; dbms_sql.parse(v_cursor_id, v
  • 从函数返回结果集(return resultset from function)
    问题 我需要从函数返回一个结果集,并像使用普通表一样使用该结果集。 因此,我需要以下内容: select * from table(querydb('select * from dual')) querydb函数应返回传递给它的查询的结果集。 可以在oracle中实现吗? 将不胜感激任何信息。 回答1 如果您需要结果集,而ref游标将不会使用名为sys.anydataset的数据类型。 也就是说,您似乎想要的是流水线函数,但是当然要使用常规的流水线函数,您需要定义输出结构,在您的情况下,该结构不是静态的。 输入任何数据集。 此类型使我们能够动态地动态生成类型(仅在硬解析时),以允许我们定义具有变化输出的流水线函数。 不幸的是,编码有点复杂。 首先,我们定义一个类型,该类型将处理传入的SQL语句。 SQL> create type dyn_pipeline as object 2 ( 3 atype anytype, 4 5 static function ODCITableDescribe(rtype out anytype, 6 stmt in varchar2) 7 return number, 8 9 static function ODCITablePrepare(sctx out dyn_pipeline, 10 tf_info in sys
  • SQL提琴输出错误(SQL Fiddle Output Error)
    问题 其实我对PL / SQL还是很陌生 我在SQL Fiddle中使用oracle pl / sql创建了下表 create table Employee(name varchar2(100),id integer, salary integer,PRIMARY KEY(id)); insert into Employee(name,id,salary) values('sa',94,100); insert into Employee(name,id,salary) values('pr',88,150); insert into Employee(name,id,salary) values('ji',33,900); insert into Employee(name,id,salary) values('na',24,880); insert into Employee(name,id,salary) values('po',65,770); insert into Employee(name,id,salary) values('ri',69,910); insert into Employee(name,id,salary) values('uj',12,650); insert into Employee(name,id,salary) values('ad',43
  • Oracle- 创建一个用于查询的临时结果集(Oracle- create a temporary resultset for use in a query)
    问题 如何在不创建表和插入数据的情况下创建用于 SQL 的临时结果集? 示例:我有一个列表,例如 10 个代码。 我想把这个放到查询中,然后查询数据库,看看这个临时列表中哪些代码在表中不存在。 如果它已经在表中,我可以执行以下操作: SELECT ITEM_CODE FROM TEMP_ITEMS MINUS SELECT ITEM_CODE FROM M_ITEMS 他们是一种不使用 PL/SQL 和纯 SQL 在查询之前创建临时行集的方法吗? 请不要用类似的东西来回答: SELECT 1 FROM DUAL UNION ALL SELECT 2 FROM DUAL 我正在考虑可以在 IN 语句中提供代码的地方,并将其转换为行以供以后查询使用。 编辑:所以每个人都知道我在这里的目标,基本上我有时会得到一个产品代码列表,我需要找到列表中哪些没有在我们的系统中设置。 我想要一种快速的方法将其放入 SQL 语句中,以便我可以看到哪些不在系统中(而不是导入数据等)。 我通常将这些放入excel,然后做一个公式,例如: ="'"&A1&"'," 这样我就可以创建我的逗号分隔列表。 回答1 如果您使用的是 oracle 11g,则可以执行此操作 with t as ( select (column_value).getnumberval() Codes from xmltable('1,2