r-RORACLE使用oracleProc将BOOLEAN参数传递给存储过程



在R Studio 2021.09.0 中使用ROracle包

我有一个存储过程


PROCEDURE A_TEST_RORACLE_IN_BOOLEAN_OUT_CLOB (v_bool IN BOOLEAN, v_resp OUT CLOB) IS
BEGIN

IF (v_bool=TRUE) THEN
v_resp := 'The value passed is TRUE';
ELSIF (v_bool=FALSE) THEN
v_resp := 'The value passed is FALSE';
ELSE
v_resp := 'The value passed is NULL';
END IF;


END A_TEST_RORACLE_IN_BOOLEAN_OUT_CLOB;

我有一个正常工作的驱动程序/控制器等-使用INTEGER IN和CLOB OUT变量调用了类似的测试程序。。。挂断了BOOLEAN的电话。

我用R脚本中的这些行来称呼它。

v_answer = FALSE  
df_test <- data.frame(v_bool=v_answer,v_resp=as.character(NA),stringsAsFactors=FALSE)  
attr(df_test$v_bool,   "ora.parameter_name") <- "oompalumpa"  
attr(df_test$v_bool,   "ora.parameter_mode") <- "IN"  
attr(df_test$v_bool,   "ora.type") <- "BOOLEAN"  
attr(df_test$v_resp,   "ora.parameter_name") <- "jazzy"          
attr(df_test$v_resp,   "ora.parameter_mode") <- "OUT"  
attr(df_test$v_resp,   "ora.type") <- "CLOB"  
v_test_smpl_mv <- 'BEGIN TESTSCHEMA.TESTPACKAGE.A_TEST_RORACLE_IN_BOOLEAN_OUT_CLOB(:oompalumpa,:jazzy);END;'
v_result <- oracleProc(con,v_test_smpl_mv,df_test)  

获取响应

Error in .oci.oracleProc(conn, statement, data = data, prefetch = prefetch,  : 
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'A_TEST_RORACLE_IN_BOOLEAN_OUT_CLOB'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

尝试过:

df_test <- data.frame(v_bool=as.logical(v_answer),v_resp=as.character(NA),stringsAsFactors=FALSE) 

省略BOOLEAN特定的ora.type属性((并将ora.type属性((设置为其他类型(CHAR、VARCHAR、RAW(并更改v_answer 的值

v_answer = 'FALSE'

所有道路都会导致静音或ORA错误。

此特别的pl/sql调用按预期返回"传递的值为NULL"。

DECLARE
v_clob CLOB;
v_char boolean;

BEGIN WRM_ADMIN.WRM_MAINT_DATA_LOAD_02.A_TEST_RORACLE_IN_BOOLEAN_OUT_CLOB(v_char,v_clob);
DBMS_OUTPUT.PUT_LINE(v_clob);
END;

剩下的结论是BOOLEAN参数是个坏主意,或者至少在OCI/RORACLE中不受支持。。。但我不知道这是在哪里记录的。

我看过这里:

https://cran.r-project.org/web/packages/ROracle/ROracle.pdf

在谷歌上搜索。。。没有什么能帮我的。

提前感谢您提供的任何明确指导。

联系了软件包@Oracle的维护人员,得到了他们将在未来版本的ROracle中添加BOOLEAN支持的报告;他们反应迅速,乐于助人。

与此同时。。。假设您已经有其他使用BOOLEAN值的代码,并且需要快速解决方法。

-- change the in parameters to char 
PROCEDURE A_TEST_RORACLE_IN_CHARBOOL_OUT_CLOB (v_bl_flg IN CHAR default 'F', v_resp OUT CLOB) IS
-- ADD THIS vvv 
v_bool BOOLEAN;
BEGIN
-- ADD THIS vvv
IF (v_bl_flg = 'T') THEN
v_bool := TRUE;
ELSIF (v_bl_flg = 'F') THEN
v_bool := FALSE
END IF;
-- ADD THIS ^^^^

IF (v_bool=TRUE) THEN
v_resp := 'The value passed is TRUE';
ELSIF (v_bool=FALSE) THEN
v_resp := 'The value passed is FALSE';
ELSE
v_resp := 'The value passed is NULL';
END IF;


END A_TEST_RORACLE_IN_CHARBOOL_OUT_CLOB;

并相应地调整R部分

v_answer = 'F'  
df_test <- data.frame(v_bl_flg=as.character(v_answer),v_resp=as.character(NA),stringsAsFactors=FALSE)  
##   attr(df_test$v_bl_flg,   "ora.parameter_name") <- "oompalumpa"  
attr(df_test$v_bl_flg,   "ora.parameter_mode") <- "IN"  
attr(df_test$v_bl_flg,   "ora.type") <- "CHAR"  
##   attr(df_test$v_resp,   "ora.parameter_name") <- "jazzy"          
attr(df_test$v_resp,   "ora.parameter_mode") <- "OUT"  
attr(df_test$v_resp,   "ora.type") <- "CLOB"  
v_test_smpl_mv <- 'BEGIN TESTSCHEMA.TESTPACKAGE.A_TEST_RORACLE_IN_CHARBOOL_OUT_CLOB(:oompalumpa,:jazzy);END;'
v_result <- oracleProc(con,v_test_smpl_mv,df_test)  

以上内容接近,但尚未测试。可能需要调整。我在ATTR((调用中建议参数名称时遇到了更多的麻烦,而不仅仅是忽略它——因此ora.parameter_name.的ATTR(

希望这能帮助将来遇到这种情况的人。

相关内容

  • 没有找到相关文章

最新更新