บันทึกขั้นตอนใหม่ใน SQLDeveloper

หากเราสร้างขั้นตอนใหม่โดยใช้ Oracle SQL Developer สมมติว่า TESTPROC

CREATE OR REPLACE PROCEDURE TESTPROC AS 
BEGIN
 --SOMETHING
END TESTPROC;

และเพียงแค่บันทึกโดยใช้ CTRL+S แล้วไม่เรียกใช้ มันจะไม่ถูกบันทึกเป็นขั้นตอนหรือไม่ ถ้าเราปิดหน้าต่างแล้วลองค้นหาตามรายการขั้นตอนแล้วหาไม่เจอ?

เราจำเป็นต้องรัน proc อย่างน้อยหนึ่งครั้งเพื่อบันทึกหรือไม่?

มีวิธีใดในการเรียกคืนขั้นตอนที่หายไปด้วยวิธีนี้?


person user2093576    schedule 10.11.2015    source แหล่งที่มา
comment
ลองค้นหาในรายการขั้นตอน... คุณหมายถึงค้นหาในระบบตาราง oracle ใช่ไหม   -  person Moudiz    schedule 10.11.2015
comment
คุณต้องคอมไพล์ขั้นตอนเพื่อบันทึกลงในดิสก์ ระยะเวลา.   -  person Lalit Kumar B    schedule 10.11.2015


คำตอบ (4)


ลองค้นหาในรายการขั้นตอน

แบบสอบถามนี้จะบอกคุณว่าขั้นตอนของคุณมีอยู่ในฐานข้อมูลของคุณหรือไม่

select * from user_procedures where object_name ='THE NAME OF YOUR PROC'

Or

select * from user_objects where object_type ='PROCEDURE' and OBJECT_NAME='THE NAME OF YOUR PROC'

เพื่อแก้ไขข้อผิดพลาด object already exists เพิ่ม or replace ในขั้นตอนของคุณเช่นนี้

create or replace procedure Proc_test ...

person Moudiz    schedule 10.11.2015
comment
หากต้องการเพิ่มมากขึ้น... สำหรับขั้นตอนแบบสแตนด์อโลน ให้ใช้ object_name และสำหรับขั้นตอนที่รวมอยู่ในแพ็คเกจ ให้ใช้ procedure_name ดู stackoverflow.com /คำถาม/28672956/ - person Lalit Kumar B; 10.11.2015

CTRL+S - คุณบันทึกไฟล์ คุณสามารถค้นหาไฟล์นี้ได้ในระบบปฏิบัติการของคุณ

หากต้องการบันทึกขั้นตอนใน DB คุณต้องสร้างขั้นตอนใน DB เพื่อสิ่งนี้คุณต้องดำเนินการ CREATE PROCEDURE ไม่ คุณไม่ได้ "บันทึก" ไว้ใน DB

person Tatiana    schedule 10.11.2015
comment
เมื่อฉันพยายามสร้างขั้นตอนใหม่ที่มีชื่อเดียวกัน ฉันได้รับข้อผิดพลาดว่ามีวัตถุอยู่แล้ว แต่ไม่พบหากฉันกรองขั้นตอนที่มีชื่อเดียวกัน จะเรียกคืนสิ่งที่มีอยู่ได้อย่างไร? - person user2093576; 10.11.2015
comment
ใช้ปุ่มรีเฟรชในนักพัฒนา SQL - person Tatiana; 10.11.2015

PLSQL Developer หรือไคลเอนต์อื่น ๆ เป็นเพียงเครื่องมือสำหรับคุณในการสื่อสารกับฐานข้อมูลเท่านั้น คุณอาจใช้ Toad, sql* หรืออินเทอร์เฟซอื่น ๆ และพวกเขาทั้งหมดอาจมีวิธีการทำสิ่งต่าง ๆ เป็นของตัวเอง

สิ่งที่คุณเรียกว่า การวิ่ง จริงๆ แล้วเรียกว่า การคอมไพล์ เมื่อคุณ "รัน" คำสั่งที่คุณระบุ คำสั่งนั้นจะถูกคอมไพล์กับฐานข้อมูลที่คุณเชื่อมต่ออยู่เท่านั้น สามารถทำงานได้จริงเท่านั้น หากคุณเรียกใช้ขั้นตอนที่คุณคอมไพล์จากบล็อก PLSQL

พยายามเข้าใจความแตกต่างระหว่างเซิร์ฟเวอร์ฐานข้อมูลและ IDE แล้วคุณจะทำงานกับ Oracle ได้อย่างสบายใจมากขึ้น

person Erkan Haspulat    schedule 10.11.2015
comment
เมื่อฉันพยายามสร้างขั้นตอนใหม่ที่มีชื่อเดียวกัน ฉันได้รับข้อผิดพลาดว่ามีวัตถุอยู่แล้ว แต่ไม่พบหากฉันกรองขั้นตอนที่มีชื่อเดียวกัน จะเรียกคืนสิ่งที่มีอยู่ได้อย่างไร? - person user2093576; 10.11.2015
comment
@ user2093576 ใช้ CREATE OR REPLACE เพื่อให้คุณไม่ได้รับข้อผิดพลาดวัตถุที่มีอยู่แล้ว - person Lalit Kumar B; 10.11.2015

เพียงบันทึกโดยใช้ CTRL+S แล้วไม่เรียกใช้ มันจะไม่ถูกบันทึกเป็นขั้นตอนหรือไม่

Oracle SQL Developer เป็น IDE และไม่ใช่เซิร์ฟเวอร์ฐานข้อมูล มี อินเทอร์เฟซ เพื่อโต้ตอบกับ ฐานข้อมูล CTRL + S เป็นทางลัดของ Windows OS และไม่เกี่ยวข้องกับฐานข้อมูล Oracle

คุณต้องคอมไพล์ขั้นตอนเพื่อจัดเก็บไว้ในดิสก์

คุณบอกว่า

เมื่อฉันพยายามสร้างขั้นตอนใหม่ที่มีชื่อเดียวกัน ฉันได้รับข้อผิดพลาดว่ามีวัตถุอยู่แล้ว

นั่นเป็นเพราะคุณไม่ได้ใช้คำสำคัญ REPLACE เพื่อแทนที่ออบเจ็กต์ที่มีอยู่

มาดูกันว่าทำไม:

SQL> CREATE PROCEDURE foo
  2  AS
  3  BEGIN
  4    NULL;
  5  END;
  6  /

Procedure created.

SQL> CREATE PROCEDURE foo
  2  AS
  3  BEGIN
  4    NULL;
  5  END;
  6  /
CREATE PROCEDURE foo
                 *
ERROR at line 1:
ORA-00955: name is already used by an existing object

วิธีหลีกเลี่ยง: ใช้ CREATE OR REPLACE

SQL> CREATE OR REPLACE PROCEDURE foo
  2  AS
  3  BEGIN
  4    NULL;
  5  END;
  6  /

Procedure created.

หากต้องการดูว่ามีขั้นตอนที่คอมไพล์แล้วในฐานข้อมูลหรือไม่ ให้สอบถามมุมมอง [DBA|ALL|USERS]_PROCEDURES

มีสองสิ่ง:

  • ขั้นตอนแบบสแตนด์อโลน - ใช้ object_name เป็นตัวกรอง
SELECT owner,
  object_name,
  procedure_name,
  object_type
FROM all_procedures
WHERE owner    ='OWNER'
AND object_name='PROC_NAME';
  • ขั้นตอนแบบแพ็กเกจ - ใช้ procedure_name เป็นตัวกรอง
SELECT owner,
  object_name,
  procedure_name,
  object_type
FROM all_procedures
WHERE owner    ='OWNER'
AND procedure_name='PROC_NAME';
person Lalit Kumar B    schedule 10.11.2015
comment
ขอบคุณสำหรับคำอธิบายโดยละเอียด ขอขอบคุณจริงๆ - person user2093576; 11.11.2015