我有一个执行这样的SQL的语句:
execute immediate cursor_rule.rule_sql into rule_result ;
我的问题是rule_sql的输出可以是null,boolean到数字。
如何在这种情况下定义rule_result?
答案 0 :(得分:2)
您可以使用:
DECLARE
rule_result VARCHAR2(4000);
BEGIN
EXECUTE IMMEDIATE :your_sql INTO rule_result;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL; -- Handle what should happen when the SQL returns zero rows.
WHEN TOO_MANY_ROWS THEN
NULL; -- Handle what should happen when the SQL returns two or more rows.
END;
/
如果你的sql语句的结果是:
rule_result
中。TO_CHAR
将其转换为VARCHAR2
值,其长度足以保持其有效数字。DATE
数据类型然后Oracle将使用TO_CHAR( date_value, NLS_DATE_FORMAT )
会话参数作为格式模型隐式调用NLS_DATE_FORMAT
,以将其转换为字符串。TIMESTAMP
数据类型然后Oracle将使用TO_CHAR( timestamp_value, NLS_TIMESTAMP_FORMAT )
会话参数作为格式模型隐式调用NLS_TIMESTAMP_FORMAT
,以将其转换为字符串。答案 1 :(得分:0)
您可以使用DBMS_SQL解析SQL语句以发现列数据类型。例如:
declare
l_cursor_id pls_integer := dbms_sql.open_cursor;
l_pointless_count pls_integer;
l_desc_cols dbms_sql.desc_tab;
l_sql long := 'select dummy as teststring, 123 as testnum, sysdate as testdate from dual';
begin
dbms_sql.parse(l_cursor_id, l_sql, dbms_sql.native);
dbms_sql.describe_columns(l_cursor_id, l_pointless_count, l_desc_cols);
for i in 1..l_desc_cols.count loop
dbms_output.put_line
( rpad(l_desc_cols(i).col_name,31) || lpad(l_desc_cols(i).col_type,4) );
end loop;
dbms_sql.close_cursor(l_cursor_id);
end;
输出:
TESTSTRING 1
TESTNUM 2
TESTDATE 12
类型代码在DBMS_TYPES和the documentation中定义(我上周发现并不一定同意)。