You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决ORACLE prepare错误ORA-00919?SAS连接Oracle报错求助

解决SAS连接Oracle时的ORA-00919错误

错误原因分析

从报错信息和代码来看,触发ORA-00919: niepoprawna funkcja(无效函数)的核心原因有两个:

  1. 宏变量未加引号导致类型不匹配:宏变量&rokmies.的值为202305,替换后SQL语句中直接以数字形式和字符型字段rdo_namestamp的截取结果比较,Oracle无法正确识别匹配逻辑,引发语法错误。
  2. 使用Oracle保留字作为别名:语句中METHOD as day的day是Oracle的保留关键字,直接用作别名会导致语法解析失败。

修正后的代码

针对第二个proc sql块,调整如下:

proc sql noprint;
connect to oracle(user=&rdo_usr. password=&rdo_pwd.
path="(DESCRIPTION=(ADDRESS = (PROTOCOL = TCP)( HOST = 122.137.78.156)(PORT = 1831))(CONNECT_DATA = (SID=RDO)))"
); 

create table plik_recharges as
select * from connection to Oracle 
(
select ACCOUNT, COSTS, METHOD as recharge_day  /* 将day替换为非保留字recharge_day */
from ptk_pop.recharge_usage 
where (balance_types = '6' or balance_types like '6,%' or balance_types like '%,6,%' or balance_types like '%,6' 
or balance_types = '2421' or balance_types like '2421,%' or balance_types like '%,2421,%' or balance_types like '%,2421')
and substr(rdo_namestamp, 1, 6) = '&rokmies.'  /* 给宏变量添加单引号,确保字符串匹配 */
);
disconnect from oracle;
quit;

额外优化建议

  • 简化balance_types匹配条件:可以用Oracle的REGEXP_LIKE函数替代冗长的like判断,代码更简洁:
    REGEXP_LIKE(balance_types, '(^|,)6(,|$)|(^|,)2421(,|$)')
    
  • 日期字段处理优化:如果rdo_namestamp是日期类型,不要用substr截取,改用TO_CHAR函数格式化后匹配,避免字符截取的潜在问题:
    TO_CHAR(rdo_namestamp, 'YYYYMM') = '&rokmies.'
    

内容的提问来源于stack exchange,提问作者kobroza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 19:39:53