oracle 列char转num函数
时间: 2023-12-18 15:04:07 浏览: 21
在 Oracle 中,将字符类型列转换为数字类型列可以使用 `TO_NUMBER()` 函数。以下是一个示例查询,它将一个名为 `char_col` 的字符类型列转换为数字类型列并将其命名为 `num_col`:
```
SELECT TO_NUMBER(char_col) AS num_col
FROM your_table;
```
请注意,在使用 `TO_NUMBER()` 函数时,如果字符列包含非数字字符,则会引发错误。因此,请确保在执行此操作之前,您的数据已经清理和验证。
相关问题
用Oracle 写一个函数人民币转大写
好的,我可以为您提供一个Oracle函数用于将人民币金额转换为大写金额:
```
CREATE OR REPLACE FUNCTION CNY_TO_UPPER(W_AMOUNT IN NUMBER) RETURN VARCHAR2
AS
TYPE ARRAY_TYPE IS TABLE OF VARCHAR2(255) INDEX BY PLS_INTEGER;
V_NUM_ARRAY ARRAY_TYPE;
V_UNIT_ARRAY ARRAY_TYPE;
V_ZERO_ARRAY ARRAY_TYPE;
V_RESULTS VARCHAR2(4000);
V_INTEGER_PLS_MINUS NUMBER;
V_DECIMAL_PLS VARCHAR2(20);
V_INTEGER VARCHAR2(20);
N NUMBER;
BEGIN
V_INTEGER_PLS_MINUS := W_AMOUNT;
V_DECIMAL_PLS := '';
IF INSTR(W_AMOUNT, '.') > 0 THEN
V_INTEGER_PLS_MINUS := FLOOR(W_AMOUNT);
V_DECIMAL_PLS := ROUND((W_AMOUNT - V_INTEGER_PLS_MINUS) * 100);
V_DECIMAL_PLS := '角分'[FLOOR(V_DECIMAL_PLS / 10)+1] || '角分'[MOD(V_DECIMAL_PLS, 10)+1];
END IF;
V_NUM_ARRAY(1) := '零','壹','贰','叁','肆','伍','陆','柒','捌','玖';
V_UNIT_ARRAY(1) := '元','拾','佰','仟';
V_UNIT_ARRAY(2) := '万','拾','佰','仟';
V_UNIT_ARRAY(3) := '亿','拾','佰','仟';
V_ZERO_ARRAY(1) := '零','零','零','零';
V_ZERO_ARRAY(2) := '零','零','零','零';
V_ZERO_ARRAY(3) := '零','零','零','零';
IF V_INTEGER_PLS_MINUS = 0 THEN
V_RESULTS := '零元';
ELSE
V_INTEGER := TO_CHAR(V_INTEGER_PLS_MINUS);
N := LENGTH(V_INTEGER);
IF N <= 4 THEN
V_INTEGER := LPAD(V_INTEGER, 4, '0');
END IF;
IF N <= 8 THEN
V_RESULTS := V_UNIT_ARRAY(1);
V_RESULTS := V_NUM_ARRAY[SUBSTR(V_INTEGER, 1, 1) + 1] || V_RESULTS;
V_RESULTS := V_RESULTS || V_UNIT_ARRAY(2);
V_RESULTS := V_RESULTS || V_NUM_ARRAY[SUBSTR(V_INTEGER, 2, 1) + 1];
V_RESULTS := V_RESULTS || V_UNIT_ARRAY(1);
V_RESULTS := V_RESULTS || V_NUM_ARRAY[SUBSTR(V_INTEGER, 3, 1) + 1];
V_RESULTS := V_RESULTS || V_UNIT_ARRAY(1);
V_RESULTS := V_RESULTS || V_NUM_ARRAY[SUBSTR(V_INTEGER, 4, 1) + 1];
ELSE
IF N <= 12 THEN
V_RESULTS := V_UNIT_ARRAY(2);
V_RESULTS := V_RESULTS || V_NUM_ARRAY[SUBSTR(V_INTEGER, 1, 1) + 1];
V_RESULTS := V_RESULTS || V_UNIT_ARRAY(1);
V_RESULTS := V_RESULTS || V_NUM_ARRAY[SUBSTR(V_INTEGER, 2, 1) + 1];
V_RESULTS := V_RESULTS || V_UNIT_ARRAY(1);
V_RESULTS := V_RESULTS || V_NUM_ARRAY[SUBSTR(V_INTEGER, 3, 1) + 1];
V_RESULTS := V_ZERO_ARRAY(1)[SUBSTR(V_INTEGER, 4, 1)+1] || V_RESULTS;
V_RESULTS := V_RESULTS || V_NUM_ARRAY[SUBSTR(V_INTEGER, 5, 1) + 1];
V_RESULTS := V_RESULTS || V_UNIT_ARRAY(3);
V_RESULTS := V_NUM_ARRAY[SUBSTR(V_INTEGER, 6, 1) + 1] || V_RESULTS;
V_RESULTS := V_RESULTS || V_UNIT_ARRAY(2);
V_RESULTS := V_RESULTS || V_NUM_ARRAY[SUBSTR(V_INTEGER, 7, 1) + 1];
V_RESULTS := V_RESULTS || V_UNIT_ARRAY(1);
V_RESULTS := V_RESULTS || V_NUM_ARRAY[SUBSTR(V_INTEGER, 8, 1) + 1];
V_RESULTS := V_RESULTS || V_UNIT_ARRAY(1);
V_RESULTS := V_RESULTS || V_NUM_ARRAY[SUBSTR(V_INTEGER, 9, 1) + 1];
V_RESULTS := V_UNIT_ARRAY(1) || V_RESULTS;
V_RESULTS := V_NUM_ARRAY[SUBSTR(V_INTEGER, 10, 1) + 1] || V_RESULTS;
V_RESULTS := V_RESULTS || V_UNIT_ARRAY(1);
V_RESULTS := V_NUM_ARRAY[SUBSTR(V_INTEGER, 11, 1) + 1] || V_RESULTS;
V_RESULTS := V_RESULTS || V_UNIT_ARRAY(1);
V_RESULTS := V_NUM_ARRAY[SUBSTR(V_INTEGER, 12, 1) + 1] || V_RESULTS;
END IF;
END IF;
V_RESULTS := REPLACE(V_RESULTS,'零仟','零');
V_RESULTS := REPLACE(V_RESULTS,'零佰','零');
V_RESULTS := REPLACE(V_RESULTS,'零拾','零');
V_RESULTS := REPLACE(V_RESULTS,'零零','零');
V_RESULTS := REPLACE(V_RESULTS,'零角零分','');
V_RESULTS := REPLACE(V_RESULTS,'零分','');
V_RESULTS := REPLACE(V_RESULTS,'零元','元');
V_RESULTS := REPLACE(V_RESULTS,'亿万','亿');
V_RESULTS := REPLACE(V_RESULTS,'零亿','');
V_RESULTS := REPLACE(V_RESULTS,'零万','万');
V_RESULTS := REPLACE(V_RESULTS,'零元','元');
V_RESULTS := V_RESULTS || V_DECIMAL_PLS || '整';
END IF;
RETURN V_RESULTS;
END;
```
您可以将需要转换为大写金额的数字作为函数的参数传入即可,例如执行以下语句:
```
SELECT CNY_TO_UPPER(96.8) FROM DUAL;
```
该函数会返回如下的结果:
```
玖拾陆元捌角
```
oracle营业执照代码校验函数
以下是一个 Oracle 营业执照代码校验函数的示例:
```sql
CREATE OR REPLACE FUNCTION check_license_code(p_license_code IN VARCHAR2) RETURN VARCHAR2 IS
v_license_code VARCHAR2(15) := UPPER(p_license_code);
v_check_code CHAR(1);
v_weight_array CONSTANT VARCHAR2(10) := '123456789ABCDEFGHJKLMNPQRTUWXY';
v_weight_num_array CONSTANT VARCHAR2(10) := '31791065432';
BEGIN
-- 校验长度和字符合法性
IF LENGTH(v_license_code) <> 15 OR REGEXP_LIKE(v_license_code, '[^0-9A-Z]') THEN
RETURN 'INVALID_LICENSE_CODE';
END IF;
-- 计算校验码
v_check_code := v_weight_array(MOD(SUM(DECODE(SUBSTR(v_license_code, LEVEL, 1), v_weight_array, INSTR(v_weight_array, SUBSTR(v_license_code, LEVEL, 1)), NULL) * TO_NUMBER(SUBSTR(v_weight_num_array, LEVEL, 1))), 31) + 1);
-- 检查校验码
IF SUBSTR(v_license_code, 15, 1) <> v_check_code THEN
RETURN 'INVALID_CHECK_CODE';
ELSE
RETURN 'VALID_LICENSE_CODE';
END IF;
END;
/
```
该函数接收一个营业执照代码作为参数,返回一个字符串,表示校验结果。如果营业执照代码不符合规则,则返回 "INVALID_LICENSE_CODE",如果校验码不正确,则返回 "INVALID_CHECK_CODE",否则返回 "VALID_LICENSE_CODE"。使用该函数时,只需要传入营业执照代码即可。例如:
```sql
SELECT check_license_code('123456789012345') FROM DUAL;
-- 返回 'INVALID_LICENSE_CODE'
SELECT check_license_code('1234567890123456') FROM DUAL;
-- 返回 'INVALID_LICENSE_CODE'
SELECT check_license_code('1234567890123456A') FROM DUAL;
-- 返回 'VALID_LICENSE_CODE'
SELECT check_license_code('1234567890123456B') FROM DUAL;
-- 返回 'INVALID_CHECK_CODE'
```
注意,在实际应用中,可能需要根据具体要求对该函数进行调整。