带有字符串变量的oracle打开游标给了我错误

Posted

技术标签:

【中文标题】带有字符串变量的oracle打开游标给了我错误【英文标题】:oracle open cursor with string variable gives me errors 【发布时间】:2017-05-13 04:37:55 【问题描述】:

我在使用字符串变量打开光标时遇到问题

这是我的 oracle 数据库代码

FUNCTION f_get_cursor(p_date_to_forecast VARCHAR) RETURN SYS_REFCURSOR AS
v_cursor SYS_REFCURSOR;
v_groupby_stmt VARCHAR(200) := 'GROUP BY ' 
                            || CASE WHEN p_date_to_forecast = 'HOLIDAY' THEN 
                               'DAY, ' ELSE '' END 
                            || 'TNI, FRMP, LR, HH;';

v_select_stmt VARCHAR2(1000) := 'SELECT WEEKDAY, TNI, FRMP, LR, HH, 
                                 AVG(Coalesce(VOLUME, 0)) AS AverageVolume
                                 FROM (SELECT v.TNI, v.FRMP, v.LR, v.DAY, 
                                       v.HH, v.VOLUME, CASE WHEN 
                                       hd.HOLIDAY_DATE is not null 
                                       then ''HOLIDAY''
                                       ELSE trim(to_char(v.DAY, ''Day'')) 
                                       END AS WEEKDAY
                                       FROM v_nem_rm16 v
                                       LEFT JOIN DBP_ADMIN.DBP_HOLIDAY hd 
                                       ON v.DAY = hd.HOLIDAY_DATE
                                       WHERE v.STATEMENT_TYPE !=''FORCAST'')
                                 WHERE WEEKDAY = ''' || p_date_to_forecast 
                                       || '''' || ' ' || v_groupby_stmt;

BEGIN
   OPEN v_cursor FOR v_select_stmt;
   return v_cursor;
END;

我只是试图根据参数“p_date_to_forcast”打开游标,它只是一周的名称字符串,如“星期六,星期二..等等”并返回游标。

当我运行查询时,我得到了这个错误 00911. 00000 - “无效字符” *原因:标识符不能以任何 ASCII 字符开头,除了 字母和数字。 $#_ 也可以在第一个之后 特点。用双引号括起来的标识符可能包含 双引号以外的任何字符。替代报价 (q'#...#') 不能使用空格、制表符或回车作为 分隔符。对于所有其他上下文,请参阅 SQL 语言 参考手册。 *行动:

是什么问题,我该如何解决???

谢谢

【问题讨论】:

我相信你不能从函数中返回引用光标。尝试在线搜索。 @Utsav 这是参考游标我想当我对 v_select_stmt 变量只有“select * from dual”时我可以返回参考游标,它工作正常 查看***.com/questions/13690110/… @Utsav 那么如何动态创建光标并返回它??? 【参考方案1】:

你试过了吗

     for r_cur in your_cursor_name(Your_parameter) Loop
     -- your working --
      End loop;

【讨论】:

我刚试过。使用我的原始代码,我认为光标甚至没有打开给我同样的错误。我已经尝试对 v_select_stmt 变量使用“从对偶中选择 1”,然后它说“my_cursor_name 未定义或不是过程”。我认为游标已经打开但是函数返回null?? 请首先定义您的游标,例如游标 cr_rs_2 (P_RS_CUST_PO varchar2,P_SHIP_FROM number) is select QUANTITY,CUST_ITEM_CODE from abc where STATUS_ORDER=0 and RS_CUST_PO=P_RS_CUST_PO and SHIP_FROM=P_SHIP_FROM; 我应该在这里定义光标“----你的工作----”吗? 嗯,很抱歉,但我真的不明白你想让我做什么。这些函数只是想打开游标并返回游标的引用,以便它可以在类似的过程中使用。我应该把for循环放在哪里,这是什么意思?对不起,我对 oracle 数据库和游标有点陌生 其实这里---cursor cr_rs_2 (P_RS_CUST_PO varchar2,P_SHIP_FROM number) is select QUANTITY,CUST_ITEM_CODE from abc where STATUS_ORDER=0 and RS_CUST_PO=P_RS_CUST_PO and SHIP_FROM=P_SHIP_FROM---- 我在定义一个游标带参数

以上是关于带有字符串变量的oracle打开游标给了我错误的主要内容,如果未能解决你的问题,请参考以下文章

oracle 游标的值如何赋给变量

Oracle 选择变量,错误 ORA-00947 没有足够的值

Oracle,如何打开游标并将其中的一列选择为变量

PL/SQL:clob 字符串中的动态查询。如何打开游标?

使用 ODBC 和用户输入连接字符串在 C# 应用程序中连接到 Oracle 11g

带有选项的 python 和 ngrok 给了我一个错误