在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(
希望这能帮助将来遇到这种情况的人。