-
30-09-2019 - |
题
我是甲骨文的新手。当我使用以下方式创建存储过程时
CREATE OR REPLACE PROCEDURE PROCEDURE1
AS
BEGIN
SELECT FIRSTNAME,
LASTNAME
INTO FirstName,LastName
FROM EMPLOYEE;
END PROCEDURE1;
我得到以下错误:
PL/SQL语句忽略标识符的名称必须被声明为ORA-00904无效标识符
解决方案
我认为“ AS”关键字将无法正常工作。如果它不起作用,则使用“ IS”。
休息很好,非常好的技巧。
如果您需要有关PL/SQL的任何帮助,则可以查看此链接。它非常简单易懂;
http://plsql-tutorial.com/
这是我解决您所遇到的错误的方法;
CREATE OR REPLACE PROCEDURE PROCEDURE1 IS
v_FIRSTNAME EMPLOYEE.FIRSTNAME%TYPE;
v_LASTNAME EMPLOYEE.LASTNAME%TYPE;
CURSOR EMPCURSOR IS
SELECT FIRSTNAME, LASTNAME FROM EMPLOYEE;
BEGIN
IF NOT EMPCURSOR%ISOPEN THEN
OPEN EMPCURSOR;
END IF;
LOOP
FETCH EMPCURSOR INTO V_FIRSTNAME,V_LASTNAME;
EXIT WHEN EMPCURSOR%NOTFOUND;
END LOOP;
IF EMPCURSOR%ISOPEN THEN
CLOSE EMPCURSOR;
END;
END PROCEDURE1;
您也可以使用 DBMS_OUTPUT.PUT_LINE(V_FIRSTNAME || ','|| V_LASTNAME)
, ,在循环内部显示输出。但是为了做到这一点,您首先需要执行命令 server output on
其他提示
您需要在尝试填充变量之前声明变量:
CREATE OR REPLACE PROCEDURE PROCEDURE1
AS
FirstName EMPLOYEE.FIRSTNAME%TYPE;
LastName EMPLOYEE.LASTNAME%TYPE;
BEGIN
SELECT FIRSTNAME,
LASTNAME
INTO FirstName,LastName
FROM EMPLOYEE;
END PROCEDURE1;
%类型表示法是与列数据类型匹配的数据类型声明的速记。如果该数据类型有所更改,则无需更新该过程。
您需要声明变量。
CREATE OR REPLACE
PROCEDURE PROCEDURE1 AS
V_FIRSTNAME VARCHAR2(60);
V_LASTNAME VARCHAR2(60);
BEGIN
SELECT FIRSTNAME,LASTNAME
INTO V_FIRSTNAME ,V_LASTNAME
FROM EMPLOYEE;
END PROCEDURE1;
在回复您的评论时,PL/SQL块中的SQL语句只能获取1个记录。如果您需要获取多个记录,则需要将记录存储在光标中并处理它们。
CREATE OR REPLACE
PROCEDURE PROCEDURE1 AS
CURSOR EMP_CUR IS
SELECT FIRSTNAME,LASTNAME
FROM EMPLOYEE;
EMP_CUR_REC EMP_CUR%ROWTYPE;
BEGIN
FOR EMP_CUR_REC IN EMP_CUR LOOP
-- do your processing
DBMS_OUTPUT.PUT_LINE('Employee first name is ' || EMP_CUR_REC.FIRSTNAME);
DBMS_OUTPUT.PUT_LINE('Employee last name is ' || EMP_CUR_REC.LASTNAME);
END LOOP;
END PROCEDURE1;
解释: EMP_CUR
保留要执行的SQL语句。 EMP_CUR_REC
保留SQL语句将获取的记录。 %ROWTYPE
表示记录将与保存数据的行相同的数据类型
这 FOR LOOP
将获取每个记录,您可以执行任何需要完成的处理。
在回应 @sathya上面的@kayak的答案中,@kayak问:“我可以从tableName中选择 * select * select * select firstName,tableName中的lastname,就像我们在sql server中一样的东西”。
是的,您可以做到这一点,但是您要么需要包括一个子句或使用光标。如果您包含一个将结果限制在一行中的WERY子句,则可以写出类似的内容
CREATE OR REPLACE PROCEDURE PROCEDURE1
IS
rowEmployees EMPLOYEE%ROWTYPE;
BEGIN
SELECT *
INTO rowEmployees
FROM EMPLOYEE
WHERE EMPLOYEE_ID = 12345;
END PROCEDURE1;
另一方面,如果您要么没有一个条款,因为您希望处理表格中的所有行,或以下方式:
CREATE OR REPLACE PROCEDURE PROCEDURE1 IS
BEGIN
FOR rowEmployees IN (SELECT *
FROM EMPLOYEE
WHERE EMPLOYEE_ID IN (12345, 67890, 111213, 141516))
LOOP
<do something with rowEmployees here>
END LOOP;
END PROCEDURE1;
分享并享受。