在oracle中处理未知数据类型的方法

时间:2017-06-29 06:41:39

标签: sql oracle plsql

我有一个执行这样的SQL的语句:

execute immediate cursor_rule.rule_sql into rule_result ;

我的问题是rule_sql的输出可以是null,boolean到数字。

如何在这种情况下定义rule_result?

2 个答案:

答案 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中。
  • 数字数据类型然后Oracle将隐式调用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_TYPESthe documentation中定义(我上周发现并不一定同意)。