【问题标题】:What is wrong with this simple (Oracle) SQL stored procedure code?这个简单的(Oracle)SQL 存储过程代码有什么问题?
【发布时间】:2011-12-06 22:08:33
【问题描述】:

我在网上查看了很多教程,我看到了很多类似的问题,因为它们使用不同的 SQL 实现,所以它们并不能回答我的问题。我正在使用 SQLPlus,oracle 10g。

CREATE OR REPLACE PROCEDURE getuserid
(uname in varchar) AS
BEGIN
select accountId from "ValidClients"
where username = uname
END getuserid;

代码 'SELECT accountId from "ValidClients" WHERE username = 'testname' ; ' 工作正常,所以我不明白我做错了什么让 SQLPlus 给我一个编译错误。

编辑:没有 INTO 子句是答案,感谢所有帮助的人。一方面解决了问题,我可以要求确认一下:java 程序将调用这些存储过程并尝试将它们存储在结果集中。下面的代码对上面的存储过程可以正常工作吗?

CallableStatement cs = connection.prepareCall("{call getuserid(?)}");
cs.setString(1, user);
ResultSet rs = cs.executeQuery();

int userid = Integer.parseInt(rs.getString(1));

EDIT2:忽略以上内容,留作后人。它不仅足以解决自己的问题,而且可以通过 Google 搜索轻松解决,并且不需要自定义答案。

【问题讨论】:

  • 你说得对,我想我不这样做是很粗鲁的。已纠正。

标签: sql oracle stored-procedures


【解决方案1】:

在select末尾加分号,需要select into一个变量

例如:

CREATE OR REPLACE PROCEDURE getuserid (uname in varchar) AS 
    v_account Number;
BEGIN 
    SELECT accountId INTO v_account 
    FROM "ValidClients"
    WHERE username = uname; 
END getuserid;

【讨论】:

    【解决方案2】:

    你把查询结果放在哪里?假设 accountId 是一个数字,您可以尝试:

    CREATE OR REPLACE PROCEDURE getuserid
    (uname_p in varchar, accountId_p out NUMBER) AS
    BEGIN
    select accountId into accountId_p from "ValidClients"
    where username = uname_p;
    END getuserid;
    

    问候

    【讨论】:

    • 这里的每个人都回答了我,这是一个很大的帮助。显然我的讲师和导师都忽略了 INTO 子句的重要性。
    • 请注意,这是 PLSQL 语法,而不是纯 SQL 语法,因此取决于您的导师和讲师所说的内容,他们可能是对的。 SQLPlus 管理 PL*SQL 和 SQL。
    • 如果您返回一个结果而不是 OUT 参数,我仍然倾向于将其设为函数。此外,您应该至少为 NO_DATA_FOUND 异常添加一个异常句柄。我会质疑你的导师和讲师,因为 INTO 子句是在 PL/SQL 中工作的语句的基础。
    • 100% 同意函数代替程序。我在示例中使用了 proc,只是因为 op 使用的是 proc。
    • 我发现最好的导师是经验(混入一点 SO ;)
    【解决方案3】:

    应该是:

    CREATE OR REPLACE 
    PROCEDURE getuserid (
       uname in varchar2
    ) 
    AS 
       v_account_id ValidClients.account_id%TYPE;
    BEGIN 
       select accountId 
        into v_account_id
        from "ValidClients" 
       where username = uname;
    END getuserid; 
    

    您可能需要考虑如何处理返回的值。 要么做一个 OUT 参数,要么更好,如果你返回一个值,让它成为一个 FUNCTION。

    CREATE OR REPLACE 
    FUNCTION getuserid (
       uname in varchar2
    ) 
    RETURN ValidClients.account_id%TYPE
    AS 
       v_account_id ValidClients.account_id%TYPE;
    BEGIN 
       select accountId 
        into v_account_id
        from "ValidClients" 
       where username = uname;
    
       RETURN v_account_id;
    EXCEPTION
       WHEN no_data_found
       THEN
          -- Handle account ID not being present
       WHEN others
       THEN
          -- Handle other errors.
    END getuserid; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多