שאלה למפתחים מעל Sql Server

nrotem

New member
שאלה למפתחים מעל Sql Server

באורקל (מולדתי) יש הפרדה צורנית ברורה בין שאילתא בודדת ובין "סקריפט". סקריפט כזה (הקרוי באורקל anonymous block) מתחיל במילה BEGIN, מסתיים במילה END וברור שזהו בלוק "פרוצדורלי". ב-SQL Server כל טקסט המועבר, נניח, דרך ODBC או JDBC, הוא בעצם בלוק פרוצדורלי. אפשר לרשום כמה שאילתות ברצף (אפילו בלי שום סימן מפריד פרט לרווח, לעזאזל!) ולקבל כמה תוצאות בבת אחת, אפשר להוסיף תנאים, לולאות וכו'. T-SQL בעצם מכילה שפת SQL סטנדרטית יחסית, והמון פקודות נוספות, flow control (כלומר תנאים, לולאות וכו') ועוד. ובעיקר: אין דרך צורנית להגיד ששאילתא היא פשוטה (SELECT בודד או DML או DDL יחיד ללא תנאים וללא פקודות מקדימות או אוחרות) או מורכבת. בעוד שהיכולת הזו לכתוב שאילתות מורכבות חזקה ומרשימה, היא עושה לי שַמות בתפיסת-העולם-המיובאת-מאורקל שלי וביכולת שלי לגייר את המוצר שלנו כהלכה ל-Sql Server. והשאלה שלי היא זו: כמה מתוך הטקסטים שאתם מעבירים ל-SQL Server בפעולה אחת (דרך xDBC למשל) הם בעצם יותר מאשר שאילתא בודדת? כמה אחוז מהשאילתות באפליקציה שאתם מפתחים אינן שאילתות פשוטות? האם מפתח מעל Sql Server שעבר הכשרה אופיינית, נוטה להשתמש בכח של T-SQL וליצור טקסטים מורכבים? אשמח לתובנות בנושא. תודה.
 

גרי רשף

New member
אינני מכיר כל כך את אוראקל

אנסה בקצרה לתאר את האובייקטים העיקריים של SQL Server: View- מבצע פקודת Select אחת. אני מנחש שזה מה שאתה קורא "שאילתה פשוטה". Stored Procedure- תוכנית או פרוצדורה שיכולה לבצע הרבה פעולות. משתמשים בה לעיתים להחזרת נתונים, אבל לי זה נראה כשימוש שאינו מתאים לה.. User Defined Function- יכולה להחזיר נתון אחד (כמו פונקציה "רגילה") וגם סט של נתונים (כמו View). נסה להסביר מה ניסית לעשות ולא הצלחת: אולי השתמשת באופן שגוי בכלים של ה-SQL Server..
 

nrotem

New member
כנראה אני טועה בטרמינולוגיה ולכן מטעה

אפשר ב-jdbc להעביר את השאילתא:
select x,y from z where m=p​
לזה אני קורא שאילתא פשוטה, כי מבוצעת "פקודה" אחת בלבד, וחוזרת תוצאה אחת בלבד (אולי הרבה שורות אבל ResultSet אחד). גם אם היה INSERT אחד או DDL אחד זה היה נחשב פשוט בעיני. מה שאפשר לבצע ב-sql server ולא באורקל הוא משהו כזה:
select * from customers select id from users insert log(text) values('xxxxxx') if not exists table x create table x(y number)​
בכוונה רשמתי בלי ירידות שורה כדי להקצין (ובטח שגיתי בתחביר קצת), אבל החשוב הוא שיש כאן Statement אחד מבחינת הדרייבר, שמועבר כיחידה אחת לבסיס הנתונים, אולם מתבצעים בעקבותיו כמה דברים, וחוזרות כמה תשובות בו זמנית (כמה ResultSets). כזה טקסט הוא בעצם סקריפט, אולי תגיד procedure אבל הוא לא stored: אין לו שם. זה מקביל ל-Anonymous block של אורקל. בקיצור, עד כמה נפוץ שתכניתן כותב משהו כמו זה:
resultSet=statement.query("select * from customers select id from users insert log(text) values('xxxxxx') if not exists table x create table x(y number)")​
מקווה שהצלחתי להסביר. קשה לי בלי טרמינולוגיה.
 
לא הרבה

אני לא תוכניתן מקצועי, בל קורא הרבה ומסתכל בהרבה דוגמאות בספרים ובweb - אני לא רואה בכלל התייחסות כזו בכלל, הנטייה היא להכניס הכל ל-SP.
 
לרוב האפליקציה שולחת פקודה אחת

די נדיר, שאפליקציה תשלח לשרת מספר פקודות משורשרות. לרוב כאשר רוצים לבצע מספר דברים (לפחות במקומות, שבהם אני עובד כDBA
), כותבים את כל הפקודות כstored procedure והאפליקציה מפעילה את הstored procedure.
 
למעלה