Sql 过程中的文本参数?

Sql 过程中的文本参数?,sql,plsql,error-handling,procedure,pls-00103,Sql,Plsql,Error Handling,Procedure,Pls 00103,我有一个任务要解决 创建一个过程,该过程将根据国家/地区表中指定的国家/地区名称列出位置表中的所有分支。列表将是国家/地区名称、城市、街道/地址、州/省。如果该国家/地区没有分支机构,请处理该情况。在PL/SQL中调用“赞比亚”的过程 这是我写的,但我有个错误。你能帮帮我吗?多谢各位 SET SERVEROUTPUT ON; CREATE OR REPLACE PROCEDURE POBOCKY(C_NAME IN COUNTRIES.COUNTRY_NAME VARCHAR2(50)%TYPE

我有一个任务要解决

创建一个过程,该过程将根据国家/地区表中指定的国家/地区名称列出位置表中的所有分支。列表将是国家/地区名称、城市、街道/地址、州/省。如果该国家/地区没有分支机构,请处理该情况。在PL/SQL中调用“赞比亚”的过程

这是我写的,但我有个错误。你能帮帮我吗?多谢各位

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;
  • 如果要从列继承数据类型,请删除显式数据类型
  • 如果参数在中,则不能选择该参数
  • 完全外接?为什么?不应该是内部连接吗。。。
    • 。。。与
      WHERE
      子句一起使用,以便按作为参数传递的城市名称筛选行
  • 如果有几个行可以返回,请考虑使用循环
    • 这也意味着您不必担心局部变量和(最常见的)异常,例如找不到数据和行太多
  • 使用表别名并在列名之前加上它们是一个好习惯;按照您的说法,不可能知道哪个列属于哪个表(因此我不会猜测)
简而言之,类似这样的事情:

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;

我认为这是错误的:
CITY\u P LOCATIONS.CITY VARCHAR2(30)%TYPE
。应为
CITY\P LOCATIONS.CITY%TYPE
,以使用列的类型,或仅为
CITY\P VARCHAR2(30)
,以专门使用VARCHAR2。如果您有一个工具可以提供详细的编译信息,包括错误所在的行以及错误是什么,那么它会有所帮助。您可以免费使用Oracle自己的。除了语法错误外,一旦运行,如果表中有多行,查询本身将抛出错误<代码>选择进入可以精确返回1行。你要么写一个
where
子句来实现这一点,要么使用一个游标从中获取信息,所以
cursorc\u就是这样然后在代码中,您可以使用
for
循环来迭代光标。谢谢您的回答,这非常有帮助。我试过你的代码,程序已经编译好了。但是现在,当我试图像这样调用这个过程时:
beginpobocky(赞比亚);结束我收到一个错误:PLS-00201:必须声明标识符“赞比亚”。我做错了什么@不客气。因为它是一个字符串,所以必须将其括在单引号中:
beginpobocky('赞比亚');结束我尝试过,但现在我得到一个错误:PLS-00905:SYSTEM.POBOCKY对象是invalid@LittlefootUh,永远不要在SYS或系统架构中创建任何对象!从未!由于您得到的错误:过程无效,您必须找出原因。再次运行CREATE语句,然后(如果使用的是SQL*Plus)运行SHOW ERR。否则,查询用户错误。