上面的问题请用oracle
时间: 2023-08-02 08:10:48 浏览: 42
以下是一个 Oracle SQL 实现:
```sql
CREATE OR REPLACE FUNCTION truncate_string(s IN VARCHAR2, num IN NUMBER) RETURN VARCHAR2 IS
new_s VARCHAR2(32767); -- 定义新字符串变量
BEGIN
IF LENGTHB(s) <= num THEN -- 字节长度小于等于 num,直接返回原字符串
RETURN s;
ELSE
new_s := SUBSTR(s, 1, num); -- 先截取前 num 个字符
WHILE LENGTHB(new_s) > num LOOP -- 如果截取后的字符串字节长度大于 num,则不断减少字符数,直到符合要求
new_s := SUBSTR(new_s, 1, LENGTH(new_s) - 1);
END LOOP;
RETURN new_s;
END IF;
END;
```
代码中用到了 Oracle 自带的 `LENGTHB` 函数来获取字符串的字节长度,然后判断是否需要裁剪。如果需要裁剪,先截取前 num 个字符,然后循环判断字节长度是否符合要求,不符合则不断减少字符数,最终得到符合要求的字符串。
相关问题
用Oracle数据库完成上面的递归
好的,以下是在Oracle数据库中完成上面递归查询的SQL语句:
```sql
WITH bom_tree(bmb01, bmb03, bmb53, cost) AS (
-- 先将成品加入递归表达式
SELECT bmb01, bmb03, bmb53, bmb53 AS cost
FROM bmb_file
WHERE bmb01 = '1'
UNION ALL
-- 递归查询元件
SELECT b.bmb01, b.bmb03, b.bmb53, b.bmb53 + t.cost
FROM bom_tree t
JOIN bmb_file b ON t.bmb03 = b.bmb01
)
-- 最终查询结果
SELECT bmb03, cost
FROM bom_tree
WHERE bmb01 IS NULL;
```
这个SQL查询使用了递归公共表达式(WITH clause)来完成递归查询,先将成品加入递归表达式,然后递归查询元件,计算每个元件的成本价。最后,查询结果只包含元件的料号和成本价,其中bmb01为空的记录表示原材料。
请使用Oracle数据库的语法
好的,以下是使用 Oracle 数据库的语法递归求所有料件的成本价的 SQL 语句:
```
WITH cte(bmb01, bmb03, bmb06, bmb53, cost) AS (
SELECT bmb01, bmb03, bmb06, bmb53, bmb06
FROM bmb_file
WHERE bmb01 IS NULL
UNION ALL
SELECT b.bmb01, b.bmb03, b.bmb06, b.bmb53, c.cost + b.bmb06 * b.bmb53
FROM bmb_file b
JOIN cte c ON b.bmb01 = c.bmb03
)
SELECT bmb01, SUM(cost) AS total_cost
FROM cte
WHERE bmb01 IS NOT NULL
GROUP BY bmb01;
```
这个 SQL 语句与上面的 PostgreSQL 语句类似,只是 Oracle 的递归查询语法略有不同。具体来说,Oracle 使用 `WITH` 子句来定义递归查询,并使用 `UNION ALL` 连接递归查询的两个部分。在递归查询的第一部分中,我们选取主件料号为 NULL 的记录,将它的元件料号和成本价加入递归结果集中;在递归查询的第二部分中,我们根据上一轮的结果集中的元件料号,找到对应的主件料号和该元件的成本价,将两者相加得到该主件的成本价,并继续递归。
最后将所有主件料号的成本价加和,即可得到所有料件的成本价。