为什么我在plsql上可以用 DECLARE v_c ceshi%rowtype; BEGIN SELECT * INTO v_c FROM ceshi WHERE id=&ID; dbms_output.put_line(v_c.id||'姓名为'||v_c.name); END;在dbevar就报错,除非id=&id变为常量比如id=8
时间: 2024-04-02 14:32:15 浏览: 172
这可能是因为在 PL/SQL 中,变量名是不区分大小写的,而在 DBeaver 中是区分大小写的。所以在 PL/SQL 中,你可以使用 "&ID" 这个变量名来获取用户输入的值,而在 DBeaver 中,你需要使用完全相同的变量名才能成功获取用户输入的值。此外,在 DBeaver 中,如果你使用了 "&ID" 这个变量名,但没有在查询前先定义它,就会导致错误。因此,你需要使用类似于下面这样的语句来定义变量:
DECLARE
v_c ceshi%rowtype;
ID NUMBER;
BEGIN
ID := &ID;
SELECT * INTO v_c FROM ceshi WHERE id=ID;
dbms_output.put_line(v_c.id||'姓名为'||v_c.name);
END;
这样就可以在 DBeaver 中成功运行这个查询了。
相关问题
select * from pat_visit t where t.discharge_date_time>=sysdate-1 and t.patient_id NOT REGEXP_LIKE(t.patient_id,'_')使用plsql执行上述语句报错,请优化
在PL/SQL块中执行SQL查询时,如果遇到错误,可能是由于语法、权限问题、无效的数据类型匹配或者其他数据库相关的异常。针对提供的SQL语句,看起来主要问题是关于`patient_id`列的正则表达式操作。如果`patient_id`不是数值类型,而是字符串,并且包含了非数字字符,那么`NOT REGEXP_LIKE`可能会引发错误,因为正则表达式对非数字无法处理。
为了优化这个查询,我们可以先确认`patient_id`列的类型,然后调整正则表达式的模式。如果是字符串类型,我们可以仅检查是否包含下划线,而不是尝试做整个ID的匹配。以下是优化后的代码示例:
```sql
DECLARE
l_min_discharge DATE := SYSDATE - 1;
BEGIN
FOR rec IN (SELECT * FROM pat_visit t
WHERE t.discharge_date_time >= l_min_discharge
AND t.patient_id NOT LIKE '%_' ESCAPE '_' -- 使用ESCAPE '_'避免下划线作为通配符
)
LOOP
-- 执行你需要的操作,如打印记录或更新数据
DBMS_OUTPUT.PUT_LINE(rec.patient_id || ', ' || rec.discharge_date_time);
END LOOP;
EXCEPTION
WHEN OTHERS THEN
-- 捕获并处理错误
RAISE_APPLICATION_ERROR(-20001, 'Error executing query: ' || SQLERRM);
END;
/
```
在这里,`LIKE '%_'`用于查找含有下划线的字符串,`ESCAPE '_'`使得下划线不再被视为通配符。
使用异常方式,处理以下代码,使其能够运行。 declare vname varchar2(20); begin select ename into vname from emp where empno=1234; end;
在Oracle SQL PL/SQL中,如果你想通过异常处理的方式确保`SELECT`语句的成功执行,可以使用`EXCEPTION`块来捕获可能出现的错误,如`NO_DATA_FOUND`(如果没有找到匹配的数据)。以下是修改后的代码:
```plsql
DECLARE
vname VARCHAR2(20);
BEGIN
-- 尝试从emp表中查找empno为1234的ename
BEGIN
SELECT ename INTO vname
FROM emp
WHERE empno = 1234;
-- 如果查询成功,则正常执行
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- 没有找到数据时,输出提示信息
DBMS_OUTPUT.PUT_LINE('No employee found with empno 1234.');
END;
-- 可能会抛出其他类型的异常,这里仅处理了NO_DATA_FOUND
END;
/
-- 相关问题--
1. 这段代码中的`EXCEPTION`块是如何工作的?
2. 如果empno字段不存在,会抛出哪种类型的异常?
3. 除了`NO_DATA_FOUND`,还有哪些常见的数据库异常可以在`EXCEPTION`中捕获?
```
阅读全文
相关推荐
















