【问题标题】:how to do you assign an anonymous variable to a column in plsql?如何将匿名变量分配给 plsql 中的列?
【发布时间】:2016-07-18 15:03:08
【问题描述】:

我正在尝试将输入变量分配给 pl/sql。

我想通过让用户输入department_id 并输出名字、姓氏和薪水来查询数据库。薪水是表中第二高的薪水。

declare  
v_dept_id int; 

Begin
Select  emp1.first_name, emp1.last_name, emp1.salary,  emp1.department_id
From employees emp1
Where (1) = 
(select count(distinct(emp1.salary))
    From employees emp2
      Where emp2.salary > emp1.salary) ;
End;  

澄清 编辑:我编辑了代码以包含 V_dept_id 但是它没有运行 声明
v_dept_id 整数;

Begin
Select  emp1.first_name, emp1.last_name, emp1.salary, emp1.department_id 
into v_dept_id
From employees emp1
Where ((1) = 
(select count(distinct(emp1.salary))
    From employees emp2
      Where emp2.salary > emp1.salary)) and v_dept_id = '&Enter_dept_id' ;
End; 

错误:

Error starting at line : 4 in command -
declare  
v_dept_id int; 

Begin
Select  emp1.first_name, emp1.last_name, emp1.salary, emp1.department_id 
into v_dept_id
From employees emp1
Where ((1) = 
(select count(distinct(emp1.salary))
    From employees emp2
      Where emp2.salary > emp1.salary)) and v_dept_id = '&Enter_dept_id' ;
End; 
Error report -
ORA-06550: line 6, column 16:
PL/SQL: ORA-00947: not enough values
ORA-06550: line 5, column 1:
PL/SQL: SQL Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

Edit2 基于以下错误反馈的答案 我不知道如何让在提示符中正确输入数字

declare  
v_dept_id number; 
v_fname varchar(50);
v_lname varchar(50);
v_salary NUMBER(8,2);

Begin
Select emp1.department_id, emp1.first_name, emp1.last_name, emp1.salary
into v_dept_id, v_fname, v_lname, v_salary
From employees emp1
Where ((1) = 
(select count(distinct(emp1.salary))
    From employees emp2
      Where emp2.salary > emp1.salary)) and v_dept_id = '&Enter_dept_id' ;
End;


Error starting at line : 1 in command -
declare  
v_dept_id number; 
v_fname varchar(50);
v_lname varchar(50);
v_salary NUMBER(8,2);

Begin
Select emp1.department_id, emp1.first_name, emp1.last_name, emp1.salary
into v_dept_id, v_fname, v_lname, v_salary
From employees emp1
Where ((1) = 
(select count(distinct(emp1.salary))
    From employees emp2
      Where emp2.salary > emp1.salary)) and v_dept_id = '&Enter_dept_id' ;
End;
Error report -
ORA-01403: no data found
ORA-06512: at line 8
01403. 00000 -  "no data found"
*Cause:    No data was found from the objects.
*Action:   There was no data from the objects which may be due to end of fetch.

【问题讨论】:

  • 你在哪里使用 v_dept_id ?问题不清楚。在plsql中,如果你使用select语句,你需要使用INTO子句将值赋给某个​​变量。
  • 刚刚添加!但是它不起作用
  • 我想创建一个 PLSQL 块,它以部门编号作为输入,并输出员工的名字和姓氏以及其中薪水第二高的员工的薪水部门
  • 你用什么工具来运行你的代码?
  • 我正在使用 SQL Developer

标签: plsql


【解决方案1】:

Raj_Te 解释了您的代码无法编译的原因。但我不太喜欢你拿第二高薪水的方法。我猜你的方法可行,但不清楚该部分代码试图实现什么。

在下面的代码中,DENSE_RANK 函数将返回每一行的工资排名。任何具有相同薪水的行都将获得相同的排名:

SELECT
 emp.first_name
,emp.last_name
,emp.salary
,emp.department_id
FROM
 (SELECT
   emp1.first_name
  ,emp1.last_name
  ,emp1.salary
  ,emp1.department_id
  ,DENSE_RANK() OVER (PARTITION BY emp1.department_id ORDER BY emp1.salary DESC)  dr
  FROM
   employees      emp1
  WHERE emp1.department_id = &dept_id
 )   emp
WHERE 1=1
AND emp.dr = 2
;

通过声明 emp.dr = 2,我们是说我们想要薪水排名第二高的所有行。

【讨论】:

  • 谢谢它的工作,但我需要删除第一个 select 语句中的 emp1,所以在第一个 select 语句中它将是 SELECT first_name, last_name, salary, department_id
  • 是的,确实,我很抱歉。别名应该是 emp - 我会更新我的答案
【解决方案2】:

您在一个变量中选择了 4 个字段。这就是为什么它没有给出足够的价值。您必须标记 4 个变量或创建一个包含 4 列的记录,然后捕获这些值。

Select  emp1.first_name, emp1.last_name, emp1.salary, emp1.department_id 
into v_dept_id  <--- trying to fetch 4 columns values to a single varibale.

您可以标记与您选择的数据类型相同的新变量并执行此操作:

Select  emp1.first_name, emp1.last_name, emp1.salary, emp1.department_id 
into v_emp_first_nm,v_emp_last_nm ,v_emp_sal,v_dept_id 

【讨论】:

  • 好的。假设用户想要在运行查询时出现的提示中输入 90,那么输入呢?我还没有完全弄清楚。我也修改了上面的错误,再次出现
  • 这应该可以解决您的问题 === stackoverflow.com/questions/15558929/… 还可以查看以下链接 ==== plsql-tutorial.com/…
  • PL/SQL 不是交互式的。提示输入是 SQL*Plus、Perl 或 Java 等客户端应用程序的工作。如果这将始终从 SQL*Plus 运行,请查看 ACCEPT
猜你喜欢
  • 1970-01-01
  • 2013-05-03
  • 2010-09-21
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多