oracle如何从查询字符串中进行选择
Posted
技术标签:
【中文标题】oracle如何从查询字符串中进行选择【英文标题】:How to select from query string in oracle 【发布时间】:2013-04-17 09:32:27 【问题描述】:假设,我有一个包含查询字符串的字符串。
如何在 oracle 中从该查询字符串中选择行?
我尝试了execute immediate
,但它什么也没返回。
declare
hello varchar(30000);
begin
hello:='select * from test_table';
execute immediate hello;
end;
【问题讨论】:
首先,你真的会尽量避免需要做这样的事情。 【参考方案1】:您将使用动态光标。
这是SQL*Plus
的示例:
SQL> var dyn_cur refcursor
SQL> DECLARE
2 l_sql_query VARCHAR2(1000);
3 BEGIN
4 -- complex function that returns a query:
5 l_sql_query := 'SELECT 1, dummy FROM dual';
6 OPEN :dyn_cur FOR l_sql_query;
7 END;
8 /
PL/SQL procedure successfully completed.
SQL> print dyn_cur
1 DUM
---------- ---
1 X
您可以在 PL/SQL 过程和包中使用动态游标:
SQL> CREATE OR REPLACE PROCEDURE prc_dyn_cur(p_dyn_cursor OUT SYS_REFCURSOR) IS
2 BEGIN
3 OPEN p_dyn_cursor FOR 'SELECT 1, dummy FROM dual';
4 END;
5 /
Procedure created.
SQL> exec prc_dyn_cur(:dyn_cur);
PL/SQL procedure successfully completed.
SQL> print dyn_cur
1 DUM
---------- ---
1 X
【讨论】:
@hsuk,为什么不这样sqlquery.com/php_oracle_ref_cursor.htm【参考方案2】:declare
hello varchar(30000);
type tb is table of test_table$rowtype;
mytb tb;
begin
hello:='select * from test_table';
execute immediate hello bulk collect into mytb;
-- now you got all og youe data in the "array" mytb
end;
请注意,此解决方案考虑到您知道要从哪个表中选择。 另外,我认为你应该描述你想要达到的目标。
【讨论】:
【参考方案3】:CREATE OR REPLACE PROCEDURE query_executer (string_query IN VARCHAR)
IS
c1 SYS_REFCURSOR;
v_last_name employees.last_name%TYPE; -- Selecting last_name
BEGIN
OPEN c1 FOR string_query; -- Opening c1 for the select statement
LOOP
FETCH c1 INTO v_last_name;
DBMS_OUTPUT.put_line (v_last_name);
EXIT WHEN (C1%NOTFOUND);
END LOOP;
END;
SET SERVEROUTPUT ON
EXECUTE query_executer('select last_name from employees');
输出
Procedure created.
Abel
Ande
Atkinso
PL/SQL procedure successfully completed.
【讨论】:
以上是关于oracle如何从查询字符串中进行选择的主要内容,如果未能解决你的问题,请参考以下文章
我想编写一个 sql (Oracle SQL) 查询来从特定字符之后的列中选择字符串的一部分
如何在 Oracle SQL 中选择一个子字符串直到一个特定的字符?