Oracle 如果员工的工资为7800美元,则会插入字符串“******”,如果员工的工资为3100美元,则插入字符串“***”

Oracle 如果员工的工资为7800美元,则会插入字符串“******”,如果员工的工资为3100美元,则插入字符串“***”,oracle,plsql,Oracle,Plsql,创建一个PL/SQL块,在stars列中为员工工资的每1000美元插入一个星号。例如,如果员工的工资为7800美元,则会插入字符串“******”,如果员工的工资为3100美元,则会插入字符串“***”。使用以下代码作为起点 DECLARE v_empid new_emps.employee_id%TYPE := &employee_id ; v_asterisk new_emps.stars%TYPE := NULL; v_sal_in_thousands new_emp

创建一个PL/SQL块,在stars列中为员工工资的每1000美元插入一个星号。例如,如果员工的工资为7800美元,则会插入字符串“******”,如果员工的工资为3100美元,则会插入字符串“***”。使用以下代码作为起点

   DECLARE
v_empid  new_emps.employee_id%TYPE := &employee_id ;
v_asterisk  new_emps.stars%TYPE := NULL;
 v_sal_in_thousands  new_emps.salary%TYPE;
BEGIN
 SELECT NVL(TRUNC(salary/1000), 0) INTO v_sal_in_thousands
 FROM  new_emps
 WHERE employee_id = v_empid;
 FOR i IN 1..v_sal_in_thousands LOOP
 v_asterisk:=v_asterisk||'*';
 UPDATE  new_emps SET stars = v_asterisk
 WHERE employee_id = v_empid;
 END LOOP;
END;

标题和文本不匹配

为什么让你用更多的空字符串填充一个空字符串?你不应该用星号来代替吗

SQL> update test set
  2    stars = rpad('*', trunc(sal/1000), '*');

10 rows updated.

SQL> select * from test;

ENAME             SAL STARS
---------- ---------- ----------
SMITH             800
ALLEN            1600 *
WARD             1250 *
JONES            2975 **
MARTIN           1250 *
BLAKE            2850 **
SCOTT            3000 ***
TURNER           1500 *
ADAMS            1100 *
JAMES             950

10 rows selected.

SQL>
根据您的要求:PL/SQL和以下范围内的循环:

SQL> begin
  2    for cur_e in (select ename, sal
  3                  from test
  4                 )
  5    loop
  6      update test set
  7        stars = rpad('*', trunc(cur_e.sal/1000), '*')
  8        where ename = cur_e.ename;
  9    end loop;
 10  end;
 11  /

PL/SQL procedure successfully completed.

SQL> select * from test;

ENAME             SAL STARS
---------- ---------- ----------
SMITH             800
ALLEN            1600 *
WARD             1250 *
JONES            2975 **
MARTIN           1250 *
BLAKE            2850 **
SCOTT            3000 ***
TURNER           1500 *
ADAMS            1100 *
JAMES             950

10 rows selected.

SQL>

问题是…?如果'v_asterisk'必须由星号组成,为什么lpad函数会创建一个空格字符串而不是星号字符串?这里PL/SQL的用途是什么?这可以通过对整个表进行一次更新来完成。@astentx-这几乎可以肯定是第一个PL/SQL课程中的一个小练习。因此,只要讲师告诉学生在现实生活中他们不会将PL/SQL用于如此简单的SQL任务,这是有道理的。然而,我们确实需要首先在非常小的测试用例上测试新事物,然后才能将它们转移到PL/SQL的实际应用程序中。可惜大多数老师没有对学生说这些。事实上,即使是Oracle自己的PL/SQL讲师也经常认为用PL/SQL做这样的工作是非常好的-@下面是一个关于PL/SQL和普通SQL代码的好例子。它中的单个更新语句是在现实世界中进行此类更新的方式,因此PL/SQL应该仅用于演示/学习目的。对不起,您可以重新键入代码吗?我仍然不明白,这个问题需要循环解决;查看一下。声明v_empno新的_emps。员工id%TYPE:=;v_星号新_emps.stars%类型:=NULL;v_sal_in_数千新员工工资%类型;开始从新EMP中选择NVLTRUNCsalary/1000,0到v_sal_in_数千,其中员工id=v_empno;对于……更新新的_emps SET stars=v_asterisk,其中员工id=v_empno;终止抱歉,问题是创建一个PL/SQL块,该块在stars列中为员工工资的每1000美元插入一个星号。例如,如果员工的工资为7800美元,则会插入字符串“****”,如果员工的工资为3100美元,则会插入字符串“”。使用以下代码作为起点。把问题加在上面你说的没有意义。如果要使用表示替换变量的参数ampersand,请创建一个存储过程,而不是匿名PL/SQL块。此外,这意味着您正在更新一条记录,该记录属于您作为参数传递其姓名或ID的员工。因此,您不需要对此进行任何循环。最后,我发布了两段代码,应该可以让您开始。该是你自己做作业的时候了。