带有字符串变量的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 选择变量,错误 ORA-00947 没有足够的值