0

我有一项任务要解决。

创建一个过程,该过程将根据国家表中指定的国家名称列出位置表中的所有分支。列表将是 country_name、city、street_address、state_province。如果该国家/地区没有分支机构,则处理该案例。在 PL/SQL 中为“Zambia”调用该过程。

我写了这个,但我在某个地方有一个错误。你能帮我么?谢谢你。

SET SERVEROUTPUT ON;
CREATE OR REPLACE PROCEDURE POBOCKY(C_NAME IN COUNTRIES.COUNTRY_NAME VARCHAR2(50)%TYPE)
IS CITY_P LOCATIONS.CITY VARCHAR2(30)%TYPE;
S_ADDRESS LOCATIONS.STREET_ADDRESS VARCHAR2(40)%TYPE;
S_PROVINCE LOCATIONS.STATE_PROVINCE VARCHAR2(25)%TYPE;
BEGIN
SELECT COUNTRY_NAME, CITY, STREET_ADDRESS, STATE_PROVINCE INTO
C_NAME, CITY_P, S_ADDRESS, S_PROVINCE FROM COUNTRIES
FULL OUTER JOIN LOCATIONS ON COUNTRIES.COUNTRY_ID = LOCATIONS.COUNTRY_ID
GROUP BY COUNTRY_NAME;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
DBMS_OUTPUT.put_line('Error');
RAISE;
END POBOCKY;
4

1 回答 1

1
  • 如果您从列继承数据类型,则删除显式数据类型
  • 如果参数为IN,则不能选择进去
  • 全外连接?为什么?不应该是内联吗...
    • ...连同WHERE子句,以便您按作为参数传递的城市名称过滤行?
  • 如果可以返回多行,请考虑使用循环
    • 这也意味着您不必担心局部变量和(最常见的)异常,例如 no_data_found 和 too_many_rows
  • 使用表别名并在列名之前使用它们是一个好习惯;你说的方式,不可能知道哪个列属于哪个表(所以我不会猜测)

很快,就像这样:

create or replace procedure pobocky
  (c_name in countries.country_name%type)
is 
begin
  for cur_r in 
    (select city, street_address, state_province 
     from countries join locations on countries.country_id = locations.country_id
     where coutry_name = c_name
    )
  loop
    dbms_output.put_line(c_name ||', '|| cur_r.city ||', '|| cur_r.street_address ||', '||
      cur_r.state_province);
  end loop;
end pobocky;
于 2021-05-25T20:43:18.740 回答